Обратите внимание, что выражение в операторе typeid будет оцениваться во время выполнения, если оно является lvalue типа с виртуальным членом.
У меня есть тривиальный класс Base
следующим образом
class Base
{
public:
Base(const std::string &s):sval(s){}
virtual ~Base()=default;
private:
std::string sval;
};
и тривиальная функция для возврата lvalue из Base следующим образом:
Base& ChangeBase(Base &b)
{
std::cout<<"Called"<<std::endl;
return b;
}
Когда я написал следующие коды для проверки оператора typeid:
int main()
{
Base b("Dream");
typeid (ChangeBase(b));
return 0;
}
Я получил следующий вывод:
Called
Called
Это указывало на то, что функция ChangeBase
вызывалась дважды, значит ли это, что выражение в typeid будет оцениваться дважды во время выполнения (если необходимо оценить во время выполнения)? Если да, то почему?
Я использую gcc 4.9.3
Called
один раз. - person WhozCraig   schedule 24.11.2016Base
и неправильно понял намерение ОП. Моя вина. - person skypjack   schedule 24.11.2016