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;