Является ли declval<T>()
заменой старого трюка (*(T*)NULL)
, чтобы получить экземпляр T в объявлении, не беспокоясь о конструкторе T?
Вот пример кода:
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;
который печатает 1, потому что T1 и T2 являются одним и тем же типом.
Если declval является более чем заменой, каковы различия и где это полезно?