在下面的代码段中,球体的生命周期是否以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都不会发出警告。
答案 0 :(得分:5)
为了进行生命周期扩展,引用必须绑定到prvalue(然后将其物化为临时对象,以便引用具有绑定的内容)。但是,capsule.sphere().radius()
不是prvalue;它是一个引用Sphere::_radius
的左值。因此,不会发生生命周期扩展,Sphere
对象及其_radius
成员将在完整表达式结束时被销毁。
答案 1 :(得分:1)
临时Sphere
- 对象的生命周期仅在包含调用的完整表达式完成之前被扩展。完整表达式为const auto& r = capsule.sphere().radius();
而不是更长,因此r
的寿命比完整表达式长,而且是暂时的。所以我明确投票给未定义的行为。