[英]C++ type qualifiers and equality
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段:
glvalue表达式或作为typeid操作数的type-id的顶级cv限定符始终被忽略。
最后,对于类型系统, int
和int*
仍然是不同的类型,并且typeid
运算符为它们返回不同的结果。
类型限定符( const
和volatile
)创建不同的类型。 int
与const int
是不同的类型。
引用,指针和数组也是如此。 例如:
int
, int&
, int[10]
和int*
都是不同的类型。
T
是由不同类型的std::remove_reference<T>::type
如果T
是一个参考。
typeid(int).name()
的<typeinfo>
输出是依赖于平台的,不必区分引用/非引用类型。 但是,正如您通过type_traits
发现的那样,C ++类型系统绝对可以区分T
和T&
。
std::type_info::name
没有std::type_info::name
身份。 如果您坚持使用typeid
测试身份,请尝试以下操作:
assert(typeid(T) != typeid(U));
这是在type_info
对象上使用定义的相等性比较运算符 。 但是要为失望做准备:由于第5.2.7 / 4节,上述声明对于T = int
和U = int&
将失败(请参阅Andy的分析工具)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.