由于r值的使用,以下代码是否具有未定义的行为

时间:2016-11-19 16:14:52

标签: c++ class rvalue-reference

根据帖子 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

1 个答案:

答案 0 :(得分:4)

实际上,a.a_是语句a.foo();中的悬空引用,因此表达式_a.foo的评估具有未定义的行为。临时对象Dog{}的生命周期在完整表达式结束时结束(并且扩展)。