首页 > 解决方案 > typeid 指针和引用比较的区别?

问题描述

当我在胡闹时,typeid我注意到了一些奇怪的行为。

#include <iostream>
#include <string>
#include <typeinfo>


int main()
{
    std::cout << "Pointer comparison: " << (typeid(const int*) == typeid(int*))
        << "\nReference comparison: " << (typeid(const int&) == typeid(int&)) << '\n';
}

输出:

指针比较:0

参考比较:1

在第一种情况下,typeid正确地表明指向常量值的指针与指向非常量值的指针不同。但是,typeidthen 似乎表明对常量值的引用与对非常量值的引用相同。

为什么typeid在指针和引用方面给出不同的结果?

标签: c++castingtypeid

解决方案


此行为由 C++17 [expr.typeid]/4 定义:

typeid应用于type-id时,结果引用std::type_info表示type-id类型的对象。如果type-id的类型是对可能 cv 限定类型的引用,则typeid表达式的结果引用std::type_info表示cv 不限定引用类型的对象。

也就是说typeid(const T&)typeid(T&)两者都给出与 相同的结果typeid(T)

此外,点 /5 也涵盖typeid(T)与 相同的typeid(const T)。引用类型和 const/volatile 限定类型没有单独的风格typeinfo请参阅 cppreference 摘要


推荐阅读