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