为什么decltype的行为定义它的方式?

时间:2014-09-28 19:32:18

标签: c++11 decltype

来自C ++草案标准N3337:

  

7.1.6.2简单类型说明符

     

4 decltype(e)表示的类型定义如下:

     

- 如果e是未加密码的 id-expression 或未加密码的类成员访问(5.2.5),decltype(e)e命名的实体的类型1}}。如果没有这样的实体,或者e命名了一组重载函数,那么该程序就是格式不正确的;

     

- 否则,如果e是xvalue,decltype(e)T&&T的类型为e;

     

- 否则,如果e是左值,则decltype(e)T&T的类型为e;

如果我理解上述内容,

int a;
decltype(a) b = 10;    // type of b is int

int* ap;
decltype(*ap) c = 10;  // Does not work since type of c is int&

您能否解释或指出一些文档解释为什么decltype(*ap)不能只是int

1 个答案:

答案 0 :(得分:6)

decltype的标准化努​​力是多年来艰巨的努力。在委员会最终接受之前,本文有7个版本。版本是:

值得注意的是,您提出的行为的种子是在第一个修订版中:N1478,它引入了“两种类型的类型:要么保留要么丢弃类型中的引用”。

本文接着给出了参考保留变体的基本原理,包括这个引用:

  

另一方面,引用丢弃语义无法提供   准确表达泛型的返回类型的机制   函数,如Strous-trup [Str02]所示。这意味着   引用丢弃类型会导致编写者出现问题   通用图书馆。

阅读这些论文是无可替代的。但是,有人可能会总结decltype有两个目的:

  1. 报告标识符的声明类型。
  2. 报告表达式的类型。
  3. 对于第二个用例,请记住表达式永远不是引用类型,而是lvalues,xvalues或prvalues之一。按照惯例,当decltype报告左值表达式的类型时,它使类型成为左值引用,当表达式为xvalue时,报告的类型将成为右值引用。

    在您的示例中,*ap是表达式,而a是标识符。因此,您的示例使用了两个用例,如N1478中首次介绍的那样。

    注意decltype不是孤立设计的,这也是有益的。其余的C ++语言在这段时间内不断发展(例如rvalue引用),并且decltype的设计被迭代以跟上步伐。

    另请注意,一旦decltype提案被接受,它就会继续(并持续至今)继续发展。请参阅此问题列表:

    http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_index.html

    特别是第7.1.6.2节(这是decltype规范的大部分存在的部分。)