Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ typeid中的表达式在运行时计算两次?_C++_Typeid - Fatal编程技术网

C++ typeid中的表达式在运行时计算两次?

C++ typeid中的表达式在运行时计算两次?,c++,typeid,C++,Typeid,请注意,如果typeid运算符中的表达式是具有虚拟成员的类型的左值,则将在运行时对其求值 我有一个简单的Base类,如下所示 class Base { public: Base(const std::string &s):sval(s){} virtual ~Base()=default; private: std::string sval; }; 以及一个普通函数,用于返回Base的左值,如下所示: Base& ChangeBase(Base &am

请注意,如果typeid运算符中的表达式是具有虚拟成员的类型的左值,则将在运行时对其求值

我有一个简单的
Base
类,如下所示

class Base
{
public:
    Base(const std::string &s):sval(s){}
    virtual ~Base()=default; 
private:
    std::string sval;
};
以及一个普通函数,用于返回Base的左值,如下所示:

Base& ChangeBase(Base &b)
{
    std::cout<<"Called"<<std::endl;
    return b;
}
我得到了以下输出:

Called
Called
它表示函数
ChangeBase
被调用了两次,那么这是否意味着typeid中的表达式将在运行时被求值两次(如果需要在运行时求值)?若有,原因为何


我使用的是GCC4.9.3

gcc,首先检查值是否为null,然后再次对其求值,然后调用typeid

大会:


仅供参考,clang 3.8打印<代码>一次,调用<代码>一次。Gcc6.1.0也打印一次。不使用g++()复制gcc 4.8.3打印一次。@skypjack如果传递了多态类型的glvalue表达式,则在运行时对该表达式进行计算。OP是正确的,谢谢。关于gcc 4.8.3和6.1中不包含此行为的原因有何见解?
Called
Called
    lea     rax, [rbp-64]
    mov     rdi, rax
    call    ChangeBase(Base&)
    test    rax, rax
    je      .L8
    lea     rax, [rbp-64]
    mov     rdi, rax
    call    ChangeBase(Base&)
...
.L8:
    call    __cxa_bad_typeid