【问题标题】:std::declval and unevaluated expressionsstd::declval 和未计算的表达式
【发布时间】:2018-04-18 21:19:52
【问题描述】:

参考下面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&lt;T&amp;&gt;() 是如何归类为未评估的?

在上面,假设declval() 返回T&amp;,正如Is there a reason declval returns add_rvalue_reference instead of add_lvalue_reference 中所讨论的那样,表达式++T&amp;(由++declval&lt;T&amp;&gt; 产生)的结果是否会变为odr-used 而不是未评估?根据ODR-use

如果一个引用被使用并且它的所指对象在 编译时间;

在上述情况下,不是编译时不知道所指对象吗?在这种情况下,引用如何首先与declval() 一起使用?

【问题讨论】:

  • 我认为decltype() 中的任何内容都未经评估。
  • 这是std::declvalpoint。您可以在decltype 中将anything 变魔术,因为它仅用于查找表达式的type

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


【解决方案1】:

++declval&lt;T&amp;&gt;() 表达式如何归类为未求值?

因为它在decltype()内:

decltype 说明符的操作数是未计算的操作数。

functionvariablestructured bindingassignment operator or constructor 等必须出现在潜在评估表达式中才能在odr 中使用 . decltype() 不符合该标准。

【讨论】:

  • 我猜我最初的问题措辞不正确。我已编辑原始问题以纠正此问题。
  • @user9196120 答案不变。 decltype() 中的内容未评估。
猜你喜欢
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多