根据帖子 r-value causes a warning without the use of std::move, 我想知道以下代码是否有未定义的行为:
struct Animal
{
virtual void foo() const
{
std::cout << "error" << std::endl;
}
};
struct Dog : public Animal
{
void foo() const
{
std::cout << "wuff" << std::endl;
}
};
struct A
{
A( const Animal& a) : _a( a ) {}
void foo()
{
_a.foo();
}
const Animal& _a;
};
int main()
{
A a( Dog{} );
a.foo();
}
在我的机器上,输出是(正如预期的那样)wuff
。
答案 0 :(得分:4)
实际上,a.a_
是语句a.foo();
中的悬空引用,因此表达式_a.foo
的评估具有未定义的行为。临时对象Dog{}
的生命周期在完整表达式结束时结束(并且不扩展)。