std :: declval和未评估的表达式

时间:2018-04-18 01:24:11

标签: c++ c++11 sfinae declval

参考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()一起使用?

1 个答案:

答案 0 :(得分:3)

  

表达式++declval<T&>()如何归类为未评估?

因为它在decltype()内:

  

decltype说明符的操作数是未评估的操作数。

functionvariablestructured bindingassignment operator or constructor等必须出现在可能已评估的表达式中才能成为 ODR使用的decltype()不符合该标准。