C++ 使用typeid运算符的最佳选择
我想知道哪种方法是比较TypeID的最佳方法。或者两者之间有什么区别:C++ 使用typeid运算符的最佳选择,c++,compare,operators,typeid,C++,Compare,Operators,Typeid,我想知道哪种方法是比较TypeID的最佳方法。或者两者之间有什么区别: typeid(std::string&)==typeid(std::string{“}) typeid(std::string)==typeid(std::string{”“}) 作为输出,它们都是正确的,但我想知道是否有“更深层次”的东西需要知道。标准[expr.typeid]: 当typeid应用于类型id时,结果引用std::type \-info表示type-id类型的对象。如果type-id的类型是对可能的cv
typeid(std::string&)==typeid(std::string{“})
typeid(std::string)==typeid(std::string{”“})
typeid
应用于类型id时,结果引用std::type \-info
表示type-id类型的对象。如果type-id的类型是对可能的cv限定类型的引用,则typeid
表达式的结果引用std::type \-info
表示引用类型的对象
从这段引文可以看出,这两种比较是等效的。优秀且良好的文档告诉您,两者是等效的 但你也问是否有更深层次的问题需要了解。是的,有:
- 在比较两个TypeID时,您必须知道不同的类型可以具有相同的字符串表示形式。所以,即使你的等式是真的,你也不能确定两边的类型是否真的相同李>
- 相反,对同一类型表达式的不同操作可能返回不同的
引用。因此,通过比较两个TypeID的地址,您无法确定它是两种不同的类型李>type\u info
因此,如果您想使用
typeid
来比较运行时类型,您应该选择its(根据标准中的非规范性注释,它保证为两个相同的类型生成相同的值,并为不同的类型提供不同的值)。或者更好,只需将typeid
本身与注释中的建议进行比较 hash_code
s对于两种不相等的类型可以相等。您想在TypeID之间使用==
。@Artyer更正。该标准保证相同类型的平等性,但建议不要求(“应该”)不同类型的不同值。我编辑过。感谢您指出:-)为什么常量限定符不重要?例如typeid(const std::string&)==typeid(std::string{“})
istrue@AlbertoSinigaglia,请注意“至可能符合cv条件的类型”。“cv”指“恒定挥发性”const std::string&
是对const-qualifiedstd::string
的引用。因此,const std::string&
的cv非限定引用类型是std::string
。