c++ - 引用是否绑定(bind)到临时未定义行为的临时?

标签 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 会延长临时对象的生命周期,但我不确定如果临时对象的成员被绑定(bind)会发生什么情况。

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

最佳答案

为了延长生命周期,引用必须绑定(bind)到一个纯右值(然后将其具体化为一个临时对象,以便引用可以绑定(bind)到某些东西)。但是,capsule.sphere().radius() 不是纯右值;它是一个指向 Sphere::_radius 的左值。因此不会发生生命周期延长,并且 Sphere 对象及其 _radius 成员将在完整表达式结束时被销毁。

关于c++ - 引用是否绑定(bind)到临时未定义行为的临时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49265297/

相关文章:

c++ - 生命周期绑定(bind)到代码块的未命名对象?

c++ - 突出显示 sql 中的搜索阶段

c++ - 从结构中打印单词

reference - 什么场景下优先使用不借用的API?

c++ - 在 C++ 中尽可能使用 const?

reference - 有没有办法返回对函数中创建的变量的引用?

rust - 为什么借阅检查员认为内容的生命周期不够长?

c++ - 检查指针是否指向数组

c++ - 将结构和结构成员传递给函数

C++ 通过引用返回