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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage