引用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,如ODR-use所述,表达式T&
的结果(由++T&
产生)不会被使用而不是未评估吗?根据ojit_a:在上述情况下,不是在编译时不知道引用对象吗?在这种情况下,首先如何将引用与
++declval<T&>
一起使用? 最佳答案
因为它在 decltype()
中:
function,variable,structured binding,assignment operator or constructor等必须出现在可能评估的表达式中才能被使用。 decltype()
不符合该条件。
关于c++ - std::declval和未求值的表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49889724/