从C++草案标准N3337:

如果我正确理解以上内容,

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

最佳答案

decltype的标准化工作是经过多年的艰苦努力。在委员会最终接受之前,共有7个版本的本文。这些版本是:

  • N1478 2003-04-28
  • N1527 2003-09-21
  • N1607 2004-02-17
  • N1705 2004-09-12
  • N1978 2006-04-24
  • N2115 2006-11-05
  • N2343 2007-07-18

  • 值得注意的是,您所质疑的行为的种子是在第一个修订版中:N1478,它引入了对“两种类型的typeof的需求:保留或删除类型中的引用”。

    本文继续给出引用保留变体的基本原理,其中包括以下引号:



    阅读这些论文无可替代。但是,可以总结出decltype有两个用途:
  • 报告标识符的声明类型。
  • 报告表达式的类型。

  • 对于第二个用例,请记住,表达式从不引用类型,而是lvalues,xvalues或prvalue之一。按照约定,当decltype报告左值表达式的类型时,它使该类型成为左值引用,而当该表达式为xvalue时,所报告的类型成为右值引用。

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

    注意到decltype不是隔离设计的,这也很有启发性。在此期间,其他C++语言也在不断发展(例如,右值引用),并且decltype的设计进行了迭代以保持同步。

    还要注意,一旦decltype提议被接受,它便会继续发展(并一直持续到今天)。请参阅以下问题列表:

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

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

    关于c++11 - 为什么decltype的行为按其定义方式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26088799/

    10-16 04:34