表达式有两种属性:值与类型。值与类型也是两种不同的数据。
decltype 作用于表达式,返回表达式的类型。declval 作用于类型,返回该类型的表达式(准确的来说是该类型加上右值引用的类型)。
常用的C语言方式 *(T*) nullptr 也能获得类型为T 的表达式,那么declval 的区别在哪里呢?
1、declval 只能在编译期间生效的语句里,比如 decltype , sizeof 还有模板元编程中。
否则会报错:type_traits:2204: error: static assertion failed: declval() must not be used!
2、由于不存在引用指针这种类型,所以如果T是引用类型时,
int m = 0;3、由于在编译期使用,declval 都不需要类型T 拥有构造函数;另外,由于存在引用折叠,注意declval 最终表达式的类型。using R = int &;decltype(std::declval<R>()++) i; //std::declval<R>()++ 表达式的类型为 int, ++std::declval<R>() 表达式的类型为int&&decltype(*(R*)nullptr) j = m; //错误