引用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() 中:



functionvariablestructured bindingassignment operator or constructor等必须出现在可能评估的表达式中才能被使用。 decltype()不符合该条件。

关于c++ - std::declval和未求值的表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49889724/

10-11 16:25