C++ C++;存储类型为';行不通
我在理解C++ C++;存储类型为';行不通,c++,object,typeid,typeinfo,C++,Object,Typeid,Typeinfo,我在理解typeid的返回类型与实际type\u info对象之间的对应关系时遇到了一些问题,这似乎与普通对象的工作方式不同。例如,我可以做 std::cout << typeid(int).name() << std::endl; ……我也不能 if(a == typeid(int)) {/*Do something*/ } //Looong error message 我缺少什么?std::type_info既不可复制构造也不可复制分配。因此,你不能做像std::
typeid
的返回类型与实际type\u info
对象之间的对应关系时遇到了一些问题,这似乎与普通对象的工作方式不同。例如,我可以做
std::cout << typeid(int).name() << std::endl;
……我也不能
if(a == typeid(int)) {/*Do something*/ } //Looong error message
我缺少什么?
std::type_info
既不可复制构造也不可复制分配。因此,你不能做像std::type\u info a=typeid(…)这样的事情
您还可以存储指向std::type_info
对象的指针,因为typeid返回左值
如果您想使用
std::type_info
对象作为容器中的键,也有一种情况。它本质上是一个薄包装,围绕着指向std::type_info
的指针std::type_index
是C++11的一个特性。首先,烦人的解析:
std::type_info a(int);
a
是一个函数(获取int
并返回std::type_info
)
其次,std::type_info
不可复制,因此不能按值存储。如果符合您的需要,您可以使用参考资料:
const std::type_info &a(typeid(int));
如果您需要实际存储std::type_info
对象(好像是“按值”,请改用;它是为此而设计的:
std::type_index a(typeid(int));
std::cout << a.name() << std::endl;
std::type_索引a(typeid(int));
std::cout可能std::type_info a(typeid(int))代码>?不,不工作,因为类型为\u info的复制构造函数是私有的…啊,是真的。然后const std::type_info&a(typeid(int))代码>?或者如果您愿意:const std::type_info*a(&typeid(int))代码>?当询问未编译的代码时,请始终逐字记录您获得的完整实际编译器输出。既然你不理解这个错误,你就不能确定你转录了它包含的所有重要线索!将记住并在此处添加一个编译器错误rodrigo:明白了!明白了。。。好的,那么std::type_info a((int))为什么不能工作呢?我的意思是,它不会被解析为一个函数,我们也不会使用它的赋值运算符或复制构造函数,对吗?@fast reflections它在语法上是胡说八道的-你缺少一个typeid
运算符std::type_info
在语言的语法中没有特殊的规则,所以在语法上,它与std::string a((int))完全相同代码>。只要你添加typeid
,你就可以从操作符的返回值中复制。啊,是的,当然,没有理由相信type\u info有一个接受类型的构造函数(事实上,这甚至是不可能的,所以你当然是对的……这是胡说八道!)
std::type_info a(int);
const std::type_info &a(typeid(int));
std::type_index a(typeid(int));
std::cout << a.name() << std::endl;