Che*_*har 5 c++ typeid language-lawyer c++11
我正在阅读 C++11 标准草案,关于 [expr.typeid] 的部分提到了以下内容(重点是我的):
[...]
当 typeid 应用于多态类类型的泛左值以外的表达式时,结果引用表示表达式静态类型的 std::type_info 对象。左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 的转换不适用于表达式。如果表达式的类型是类类型,则该类应该是完全定义的。该表达式是一个未计算的操作数(第 5 条)。
当 typeid 应用于type-id 时,结果引用表示 type-id 类型的 std::type_info 对象。如果 type-id 的类型是对可能有 cv 限定类型的引用,则 typeid 表达式的结果引用表示 cv 未限定引用类型的 std::type_info 对象。如果 type-id 的类型是类类型或类类型的引用,则该类应该是完全定义的。
进一步在同一部分的 p5 中,它继续给出以下示例:
class D { /* ... */ };
D d1;
const D d2;
typeid(d1) == typeid(d2); // yields true
typeid(D) == typeid(const D); // yields true
typeid(D) == typeid(d2); // yields true
typeid(D) == typeid(const D&); // yields true -- (1)
Run Code Online (Sandbox Code Playgroud)
给出以下代码示例:
int main()
{
int foo = 42;
int &bar = foo;
bool comp1 = (typeid(int) == typeid(int&)); // Yields true, same as (1) -- (2)
bool comp2 = (typeid(foo) == typeid(bar)); // Yields true, Why? -- (3)
}
Run Code Online (Sandbox Code Playgroud)
我的理解是[expr.typeid]p4只讨论typeid( type-id )和barintypeid(bar)是一个id-expression而不是type-id。为什么上面的(3)评估为true?标准中的哪个文本涵盖了这一点?我错过了什么?
答案在[expr]中
\n\n\n\n\n5如果表达式最初的类型为 \xe2\x80\x9c,对 T\xe2\x80\x9d ([dcl.ref],\n [dcl.init.ref]) 的引用,则在任何进一步的操作之前,将类型调整为 T \n分析。该表达式指定引用所表示的对象或函数,并且该表达式是左值还是x值,具体取决于表达式。
\n
所以当我们进入[expr.typeid]
\n\n\n\n\n3当 typeid 应用于除多态类类型的泛左值之外的表达式时,结果引用表示表达式静态类型的 std::type_info 对象。左值到右值 ([conv.lval])、数组到指针 ([conv.array]) 和\n 函数到指针 ([conv.func]) 转换不适用于\ n 表达。如果表达式的类型是类类型,则该类应是完全定义的。该表达式是未计算的操作数\n(子句 [expr])。
\n
typeid在检查时,所讨论的 id 表达式已经是引用的类型。