c++ - 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
正确地表明指向常量值的指针与指向非常量值的指针不同。但是,typeid
then 似乎表明对常量值的引用与对非常量值的引用相同。
为什么typeid
在指针和引用方面给出不同的结果?
解决方案
此行为由 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 摘要。
推荐阅读
- python - 将基矩阵的变化拟合到数据
- r - 如何在闪亮时每隔一定时间重新读取数据
- java - 如何转换列表
使用java 8树状结构? - python - AttributeError:“list”对象没有属性“send_keys”
- javascript - 使用 Slick carousel 对可见项目进行编号
- java - 如何对 Selenium 中的 WebElement 列表执行操作
- c# - 我应该调用异步 SignalR 集线器方法 MethodNameAsync(),还是不调用
- python - 如果我使用 Cloud Foundry 和 python buildpack,如何安装 ffmpeg
- mysql - SELECT 查询,其中 LIMIT 是重复键的不同计数
- elasticsearch - 我想用我自己的证书替换搜索保护演示证书