C ++ 11 declval:什么是"未评估的上下文"?

时间:2016-06-21 03:07:26

标签: c++11 definition evaluation

cppreference web site引入了declval:

  

请注意,因为declval不存在定义,所以它只能在未评估的上下文中使用

我检查了ISO C ++ 11标准,没有"未评估的上下文"的短语。这是编译原则中的概念还是别的什么?

感谢。

1 个答案:

答案 0 :(得分:1)

从标准[第5节,第7节]

  

在某些情况下,出现未评估的操作数(5.2.8,5.3.3,5.3.7,   7.1.6.2)。未评估未评估的操作数。 [注意:在未评估的操作数中,非静态类成员可以命名为(5.1)和   命名对象或函数本身并不需要a   提供定义(3.2)。 - 结束说明]

使用它的上下文:

  1. 类型识别[第5.2.8节]
  2. 尺寸操作员[第5.3.3节]
  3. noexcept [第5.3.7节]
  4. 类型说明符例如decltype(declval<T>()) [第7.1.6.2节]
  5. 所以,在外行术语中(据我所知),它不能用作a + b;之类的独立表达式。

    根据马萨的评论如下:

      

    在上面提到的上下文中,表达的表达式   未评估的操作数展开,以便其结果的类型(和,   在sizeof的情况下,可以确定该类型的大小)   表达的评价从未被纳入最终   程序。

         

    示例:typeof(std::cout << "1\n") &x = std::cout;永远不会   生成代码以将“1 \ n”打印到标准输出。