C++ typeid中的表达式在运行时计算两次?
请注意,如果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
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.3gcc,首先检查值是否为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