来自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
?
答案 0 :(得分:6)
decltype
的标准化努力是多年来艰巨的努力。在委员会最终接受之前,本文有7个版本。版本是:
值得注意的是,您提出的行为的种子是在第一个修订版中:N1478,它引入了“两种类型的类型:要么保留要么丢弃类型中的引用”。
本文接着给出了参考保留变体的基本原理,包括这个引用:
另一方面,引用丢弃语义无法提供 准确表达泛型的返回类型的机制 函数,如Strous-trup [Str02]所示。这意味着 引用丢弃类型会导致编写者出现问题 通用图书馆。
阅读这些论文是无可替代的。但是,有人可能会总结decltype
有两个目的:
对于第二个用例,请记住表达式永远不是引用类型,而是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
规范的大部分存在的部分。)