【发布时间】:2020-09-19 20:43:05
【问题描述】:
我正在阅读 C++11 标准草案,关于 [expr.typeid] 的部分提到以下内容(强调我的):
[...]
当 typeid 应用于多态类类型的 glvalue 以外的表达式时,结果是指 到表示表达式的静态类型的 std::type_info 对象。左值到右值(4.1),数组到指针 (4.2) 和函数到指针 (4.3) 的转换不适用于表达式。如果类型 表达式是一个类类型,这个类应该是完全定义的。表达式是未计算的操作数 (第 5 条)。
当 typeid 应用于 type-id 时,结果引用一个 std::type_info 对象,表示其类型 类型 ID。 如果 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)
给定以下代码示例:
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)
}
我的理解是 [expr.typeid]p4 只讨论 typeid(type-id) 和 bar 中的形式typeid(bar) 是 id-expression 而不是 type-id。为什么上面的 (3) 评估为true?标准中的哪些文本涵盖了这一点?我错过了什么?
【问题讨论】:
-
typeid不关心常量或引用。对于typeid,它仍然是同一类型。 -
你的问题有答案。 如果 type-id 的类型是对可能有 cv 限定的类型的引用,则 typeid 表达式的结果是指一个 std::type_info 对象,该对象表示 cv 不限定的引用类型。 意味着你得到的是被引用事物的 typeid,而不是引用本身。
-
注意它说的是referenced type.,而不是reference type。
-
@NathanOliver 文本说 当 typeid 应用于 type-id 时,我试图弄清楚它在哪里说“当 typeid应用于 glvalue 表达式...结果引用了一个 std::type_info 对象,表示 cv-unqualified 引用类型"?
-
@NathanOliver - 这不是问题的答案。
bar不是 type-id,段落不适用
标签: c++ c++11 language-lawyer typeid