C ++类型限定符和相等

时间:2013-02-11 15:57:36

标签: c++

int&int类型相同吗?如果我使用is_same<int,int&>::value我得到falsetypeid(int).name() == typeid(int&).name()是相同的吗?

其次是intconst int的相同问题?

第三个intint*

我可以理解intint*是不是因为实际存储了另一个对象的地址并且工作方式不同但我认为int&int是一个只是另一个的别名。

热衷于对此进行一些好的评论。

3 个答案:

答案 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&)会给出相同的结果,尽管这两种类型肯定是不同的。同样,对于类型系统intint const是不同的类型,但typeid运算符会忽略const限定。从C ++ 11标准的第5.2.7 / 5段开始:

  

glvalue表达式的顶级cv限定符或作为typeid操作数的type-id始终被忽略。

最后,intint*又是类型系统的不同类型,typeid运算符会为它们返回不同的结果。

答案 1 :(得分:2)

键入限定符,(constvolatile),创建不同的类型。 intconst int的版本不同。

引用,指针和数组也是如此。例如:

intint&int[10]int*都是不同的类型。

如果T是参考,则

std::remove_reference<T>::typeT的类型不同。

<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 = intU = int&的上述断言将失败。