在下面的代码片段中,球体的生命周期是否以 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 会延长临时对象的生命周期,但我不确定如果临时对象的成员被绑定(bind)会发生什么情况。
注意:我非常怀疑这段代码的等价物对我造成了错误,但 Clang 和 Visual Studio 都没有发出警告。
最佳答案
为了延长生命周期,引用必须绑定(bind)到一个纯右值(然后将其具体化为一个临时对象,以便引用可以绑定(bind)到某些东西)。但是,capsule.sphere().radius()
不是纯右值;它是一个指向 Sphere::_radius
的左值。因此不会发生生命周期延长,并且 Sphere
对象及其 _radius
成员将在完整表达式结束时被销毁。
关于c++ - 引用是否绑定(bind)到临时未定义行为的临时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49265297/