参考Proposing Standard Library Support for the C++ Detection Idiom中的以下示例:
// 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()
返回Is there a reason declval returns add_rvalue_reference instead of add_lvalue_reference
中讨论的T&
,则表达式++T&
(由++declval<T&>
生成)的结果不是变得有用而不是没有评估?根据{{3}}:
如果使用了参考,则使用该参考并且其参照物未知 编译时间;
在上面的例子中,编译时不知道指示对象?在这种情况下,如何将引用与declval()
一起使用?
答案 0 :(得分:3)
表达式
++declval<T&>()
如何归类为未评估?
因为它在decltype()
内:
decltype
说明符的操作数是未评估的操作数。
function,variable,structured binding,assignment operator or constructor等必须出现在可能已评估的表达式中才能成为 ODR使用的。 decltype()
不符合该标准。