0

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

其次,同样的问题intconst int

第三intint*

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

渴望得到一些好的评论。

4

3 回答 3

4

来自 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&)将给出相同的结果,尽管这两种类型肯定是不同的。同样,对于类型系统intint const是不同的类型,但typeid操作符忽略了const限定。来自 C++11 标准的第 5.2.7/5 段:

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

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

于 2013-02-11T16:07:13.113 回答
2

类型限定符 (constvolatile) 创建不同的类型。 int是与 不同的类型const int

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

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

Tstd::remove_reference<T>::type与ifT是一个引用不同的类型。

<typeinfo>输出typeid(int).name()取决于平台,不必区分引用/非引用类型。但是,正如您通过.TT&type_traits

于 2013-02-11T16:01:31.807 回答
0

std::type_info::name没有提到身份。如果您坚持使用typeid来测试身份,请尝试以下操作:

assert(typeid(T) != typeid(U));

这是在对象上使用定义的相等比较运算符。type_info但要做好失望的准备:上述断言将因 §5.2.7/4 而T = int失败(参见 Andy 的分析器)。U = int&

于 2013-02-11T16:07:25.400 回答