Ist declval <T> () dasselbe wie (* (T *) nullptr)?
Istdeclval<T>()
nur ein Ersatz für den alten Trick von(*(T*)NULL)
man eine Instanz von T in einem Decltype bekommt, ohne sich um den Konstruktor von T sorgen zu müssen?
Hier ist ein Beispielcode:
struct A {};
struct B {
A a;
};
typedef decltype((*(B*)nullptr).a) T1;
typedef decltype(declval<B>().a) T2;
cout << "is_same: " << is_same<T1, T2>::value << endl;
Dies gibt 1 aus, da T1 und T2 vom selben Typ sind.
Wenn declval mehr als ein Ersatz ist, was sind die Unterschiede und wo ist es nützlich?