是否在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参数的吗?
答案 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条)。