从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,它引入了对“两种类型的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/