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

Vik*_*ehr 8 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;
 }
Run Code Online (Sandbox Code Playgroud)

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

注意:我非常怀疑这个片段的等价物对我造成了错误,但是Clang和Visual Studio都没有发出警告.

Bri*_*ian 5

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