函数未在类型id中调用

Is function not called inside typeid?

本文关键字:调用 id 类型 函数      更新时间:2023-10-16

函数不是在类型id中调用的吗?请考虑下面的代码。

#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 的操作数是多态类类型的 glvalue 时,才会计算它。由于mul10的返回类型,即int,不是多态类类型,因此不计算操作数,这意味着不调用mul10

如果我们

去看标准的草案C++它告诉我们,除非多态类类型的表达式glvalue,否则结果基于对象的静态类型。从第 5.2.8 节 [expr.typeid] 强调我的:

当 typeid 应用于多态类类型的 glvalue 以外的表达式时,结果将引用 到 std::type_info 对象,表示表达式的静态类型。Lvalue-to-rvalue (4.1(,数组到指针 (4.2( 和函数到指针 (4.3( 转换不会应用于表达式。如果类型 表达式是一种类类型,该类应完全定义。表达式是未计算的操作数 (第5条(。