是不是在typeid里面调用了函数?

时间:2015-10-28 22:04:28

标签: c++

是否在typeid内部调用了函数?请考虑以下代码。

#include <iostream>
#include <typeinfo>
using namespace std;

int mul10(int &s)
{
    static int count = 1;
    cout << "Evaluating call " << count << endl;
    count++;
    s *= 10;
    return(s);
}

int main()
{
    int i = 5;
    cout << typeid(mul10(i)).name() << endl;
    cout << i << endl;
    return(0);
}

所以这里的输出是

int
5

很明显i的值没有改变,实际上也没有调用函数mul10。那是怎么评估typeid参数的吗?

2 个答案:

答案 0 :(得分:12)

typeid的操作数仅在它是多态类类型的glvalue时才被计算。由于mul10的返回类型(即int)不是多态类类型,因此不会对操作数进行求值,这意味着不会调用mul10

答案 1 :(得分:1)

如果我们转到C ++标准草案,它告诉我们除非多态类类型的表达式glvalue,否则结果是基于对象的静态类型。来自5.2.8 [expr.typeid] 部分,重点是我的:

  

当typeid应用于表达式而不是多态类类型的glvalue时,结果引用   表示表达式的静态类型的std :: type_info对象。 Lvalue-to-rvalue(4.1),array-topointer   (4.2),并且函数到指针(4.3)的转换不应用于表达式。如果是的类型   expression是一个类类型,该类应该是完全定义的。表达式是未评估的操作数   (第5条)。