int&
和int
类型相同吗?如果我使用is_same<int,int&>::value
我得到false
但typeid(int).name() == typeid(int&).name()
是相同的吗?
其次是int
和const int
的相同问题?
第三个int
和int*
?
我可以理解int
和int*
是不是因为实际存储了另一个对象的地址并且工作方式不同但我认为int&
和int
是一个只是另一个的别名。
热衷于对此进行一些好的评论。
答案 0 :(得分:4)
来自C ++ 11标准的第5.2.7 / 4段:
当typeid应用于type-id时,结果引用表示type-id类型的std :: type_info对象。 如果type-id的类型是对可能的cv限定类型的引用,则typeid表达式的结果引用表示cv-unqualified引用类型的std :: type_info对象。如果type-id的类型是类类型或类类型的引用,则应该完全定义类。
因此,typeid(int)
和typeid(int&)
会给出相同的结果,尽管这两种类型肯定是不同的。同样,对于类型系统int
和int const
是不同的类型,但typeid
运算符会忽略const
限定。从C ++ 11标准的第5.2.7 / 5段开始:
glvalue表达式的顶级cv限定符或作为typeid操作数的type-id始终被忽略。
最后,int
和int*
又是类型系统的不同类型,typeid
运算符会为它们返回不同的结果。
答案 1 :(得分:2)
键入限定符,(const
和volatile
),创建不同的类型。 int
与const int
的版本不同。
引用,指针和数组也是如此。例如:
int
,int&
,int[10]
和int*
都是不同的类型。
T
是参考,则 std::remove_reference<T>::type
与T
的类型不同。
<typeinfo>
的{{1}}输出取决于平台,不必区分引用/非引用类型。但是,C ++类型系统肯定区分typeid(int).name()
和T
,正如您通过T&
发现的那样。
答案 2 :(得分:0)
std::type_info::name
对身份一无所知。 如果您坚持使用typeid
来测试身份,请尝试以下操作:
assert(typeid(T) != typeid(U));
这是在type_info
个对象上使用定义的equality comparison operator。但是为失望做准备:由于§5.2.7/ 4(参见Andy的anser),T = int
和U = int&
的上述断言将失败。