引用绑定到临时的未定义行为的临时?

时间:2018-03-13 20:26:16

标签: c++ reference lifetime

在下面的代码段中,球体的生命周期是否以r的值未定义的方式扩展?

 struct Sphere {
   auto& radius() const { return _radius;}
   float _radius{};
 };
 struct Capsule {
   auto sphere() const { return Sphere{12.0}; }
 };
 auto func() {
   auto capsule = Capsule{};
   const auto& r = capsule.sphere().radius();
   std::cout << r;
 }

我知道const-references延长了临时的生命周期,但我不确定如果临时成员被绑定会发生什么。

注意:我非常怀疑此代码段的相应内容会对我造成错误,但Clang和Visual Studio都不会发出警告。

2 个答案:

答案 0 :(得分:5)

为了进行生命周期扩展,引用必须绑定到prvalue(然后将其物化为临时对象,以便引用具有绑定的内容)。但是,capsule.sphere().radius()不是prvalue;它是一个引用Sphere::_radius的左值。因此,不会发生生命周期扩展,Sphere对象及其_radius成员将在完整表达式结束时被销毁。

答案 1 :(得分:1)

临时Sphere - 对象的生命周期仅在包含调用的完整表达式完成之前被扩展。完整表达式为const auto& r = capsule.sphere().radius();而不是更长,因此r的寿命比完整表达式长,而且是暂时的。所以我明确投票给未定义的行为。