【发布时间】:2013-03-31 17:33:10
【问题描述】:
[C++11: 7.1.6.2/4]:decltype(e)表示的类型定义如下:
- 如果
e是未加括号的id-expression 或未加括号的类成员访问(5.2.5),则decltype(e)是e命名的实体的类型。如果不存在这样的实体,或者如果e命名了一组重载函数,则程序格式错误;- 否则,如果
e是xvalue,则decltype(e)是T&&,其中T是e的类型;- 否则,如果
e是左值,decltype(e)就是T&,其中T是e的类型;- 否则,
decltype(e)是e的类型。
decltype说明符的操作数是未计算的操作数(第 5 条)。
第二、第三和第四种情况明确指的是表达式的类型,不包括任何多态性考虑。
但是,我不完全确定“entity”在这里是什么意思,first 案例似乎是在命名所引用的 object通过表达式e。 “实体的类型”是指它的运行时类型还是它的静态类型,对我来说是模棱两可的。
【问题讨论】:
-
哦,看!这是“回答你自己的问题”——嫉妒的警察。
-
别介意他们,出于同样的原因,我被否决了。未来的读者可能想看看this。
-
-1,在 C++ 中所有类型都是静态的,并且只存在于编译时。
-
@Abyx:不,“动态类型”存在。也就是说,object 的类型而不是产生访问它的表达式。考虑
A* a = new B(),您就会知道*a所指对象的动态类型 是什么。例如,请参阅[C++11: 10.3/9],其中使用了该术语。 -
一个更明显的答案:你引用的最后一句话。如果
decltype的操作数没有被求值,那么就没有动态类型这样的东西。decltype是编译时评估(如sizeof),因此只能使用静态类型。
标签: c++ c++11 language-lawyer decltype