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