【问题标题】:typeid / type_info strange behaviourtypeid / type_info 奇怪的行为
【发布时间】:2016-12-11 14:31:17
【问题描述】:

为什么下面的例子:

#include <iostream>
#include <typeinfo>

template<typename T>
void fun(const T& param)
{
        std::cout << "T = " << typeid(T).name() << std::endl;
        std::cout << "param = " << typeid(param).name() << std::endl;
        std::cout << (typeid(T)==typeid(param)) << std::endl;
}

int main(int, char**)
{
        fun(1);
}

给出以下输出:

T is i
param is i
1

我知道type_info::name() 的行为取决于实现。无论如何,我希望operator== 返回false(因为param 是一个常量引用而不是整数)。

【问题讨论】:

  • 在您的代码中使用==,但在您的问题中使用!=。澄清。
  • typeid 忽略顶级限定符(包括引用)。
  • 抱歉,已修复
  • 你期待输出int吗?如果是这样,fine print:filter through c++filt -t if using gcc or similar.
  • 我应该更准确地说:typeid 可以应用于类型或表达式(就像sizeof)。表达式param 的类型为const T(请记住,表达式是值,从不引用)。而typeid 会忽略顶级 cv 限定符。

标签: c++ typeid


【解决方案1】:

这在标准中是这样定义的:

5.2.8/5: 如果表达式的类型或 type-id 是 cv 限定的类型,则 typeid 表达式的结果是指 表示 cv 非限定类型的 std::type_info 对象 [示例:

class D { /* ... */ };
D d1;
const D d2;
typeid(d1) == typeid(d2); // yields true
typeid(D) == typeid(const D); // yields true
typeid(D) == typeid(d2); // yields true
typeid(D) == typeid(const D&); // yields true

——结束示例]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2019-04-27
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多