为什么C++中operator<<无法直接输出typeid()结果,却可输出typeid().name()结果?
为什么C++中operator<<无法直接输出typeid()结果,却可输出typeid().name()结果?
嘿,这个问题问得特别实在!我来给你拆解清楚背后的原因~
首先得搞明白typeid()到底返回的是什么:当你调用typeid(变量/表达式)时,它返回的是一个**std::type_info类型的对象**。而C++的标准库里面,并没有为std::type_info这个类型预定义operator<<(也就是我们常用的输出操作符)。编译器找不到对应的输出逻辑,自然就会报错,这就是你第二个代码跑不起来的核心原因。
那为啥typeid().name()就能正常输出呢?因为name()成员函数的返回值是一个const char*——也就是C风格的字符串指针。C++标准库早就为const char*类型重载了operator<<,所以直接把它丢给std::cout完全没问题,这也是第一个代码能顺利运行的原因。
如果你就是想直接输出typeid()返回的std::type_info对象,其实也有办法:自己给std::type_info写一个operator<<的重载函数就行,比如这样:
#include <iostream> #include <typeinfo> // 自定义重载输出操作符 std::ostream& operator<<(std::ostream& os, const std::type_info& ti) { // 本质还是调用name()来输出字符串 return os << ti.name(); } int main() { int i {1}; std::cout << typeid(i) << '\n'; // 现在就能正常输出啦 double f {3.14}; std::cout << typeid(f) << '\n'; std::cout << typeid(i + f) << ' ' << i + f << '\n'; return 0; }
最后提个小细节:type_info::name()返回的字符串格式是编译器相关的,没有统一标准。比如在GCC/Clang里,int的name会输出"i",而在MSVC里可能直接输出"int",这点注意就行~
内容来源于stack exchange
相关产品推荐
相关产品推荐

