参考为C++检测习惯用法提供标准库支持中的以下示例:
// primary template handles types that do not support pre-increment
template< class, class = void_t<> >
struct
has_pre_increment_member : false_type { };
// specialization recognizes types that do support pre-increment
template< class T >
struct
has_pre_increment_member<T, void_t<decltype( ++declval<T&>() )>> : true_type { };
表达式如何分类为未计算++declval<T&>()
?
在上面,假设declval()
返回T&
如是否有原因 declval 返回add_rvalue_reference而不是add_lvalue_reference,表达式 ++T&
的结果(由 ++declval<T&>
产生(不会变成 ODR 使用而不是未计算吗?根据 ODR 用途:
在如果使用引用,则引用是 ODR 使用的,并且其引用在 编译时;
上述情况下,引用对象在编译时不是不知道吗?在这种情况下,如何首先将引用与declval()
一起使用?
表达式如何分类
++declval<T&>()
为未计算?
因为它在decltype()
范围内:
函数、
decltype
说明符的操作数是未计算的操作数。
变量、结构化绑定、赋值运算符或构造函数等必须出现在潜在计算的表达式中才能使用 odr。 decltype()
不符合该标准。