C++ 使用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的最佳方法。或者两者之间有什么区别:

  • 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​::​type \-info
    表示引用类型的对象


    从这段引文可以看出,这两种比较是等效的。

    优秀且良好的文档告诉您,两者是等效的

    但你也问是否有更深层次的问题需要了解。是的,有:

    • 在比较两个TypeID时,您必须知道不同的类型可以具有相同的字符串表示形式。所以,即使你的等式是真的,你也不能确定两边的类型是否真的相同
    • 相反,对同一类型表达式的不同操作可能返回不同的
      type\u info
      引用。因此,通过比较两个TypeID的地址,您无法确定它是两种不同的类型

    因此,如果您想使用
    typeid
    来比较运行时类型,您应该选择its(根据标准中的非规范性注释,它保证为两个相同的类型生成相同的值,并为不同的类型提供不同的值)。或者更好,只需将
    typeid
    本身与注释中的建议进行比较

    hash_code
    s对于两种不相等的类型可以相等。您想在TypeID之间使用
    ==
    。@Artyer更正。该标准保证相同类型的平等性,但建议不要求(“应该”)不同类型的不同值。我编辑过。感谢您指出:-)为什么常量限定符不重要?例如
    typeid(const std::string&)==typeid(std::string{“})
    istrue@AlbertoSinigaglia,请注意“至可能符合cv条件的类型”。“cv”指“恒定挥发性”
    const std::string&
    是对const-qualified
    std::string
    的引用。因此,
    const std::string&
    的cv非限定引用类型是
    std::string