【问题标题】:C++ storing a const& to a temporary [duplicate]C ++将const&存储到临时[重复]
【发布时间】:2018-05-22 11:41:44
【问题描述】:

最近我在一个项目中遇到了一个问题。那里的代码比下面的例子复杂得多,但我希望问题(如果有的话)是一样的。

#include <iostream>
class mObject
{
public:
    mObject(){ std::cout << "mObject ctor\n"; }
    mObject(const mObject& other){ std::cout << "mObject copy ctor\n"; }
    ~mObject(){ std::cout << "mObject dtor\n"; }
};

struct cFoo{
    cFoo(const mObject& obj):obj_(obj){}
    const mObject& get() { return obj_;}
    const mObject& obj_;
};

mObject giveme() { return mObject(); }
void func2(const mObject& p) { mObject g = p; }

int main()
{
    cFoo k(giveme());
    func2(k.get());
    return 0;
}

这给了我以下代码:

mObject ctor
mObject dtor
mObject copy ctor
mObject dtor

所以原来的“临时”mObject 实例在func2 使用它之前就死掉了。我认为如果有一个const&amp; 可以延长临时object 的寿命。在函数main 中将giveme() 的返回分配给本地const&amp; 解决了这个问题。然后临时生命直到main 的范围结束。那么这里发生了什么???

【问题讨论】:

  • 终身扩展适用于绑定到本地引用的临时(或临时的一部分)。在这种情况下,编译器可以简单地将临时变量视为局部变量。在函数调用中传递引用时,这是不可能的。

标签: c++ temporary-objects const-reference


【解决方案1】:

在同一函数的同一作用域内,您可以通过将匿名临时对象绑定到const 引用来延长其生命周期;为免生疑问,此行为跨函数调用传递。

【讨论】:

  • 嗯,最好举个例子来说明“考虑std::reference_wrapper”是什么意思。正如所写的那样,这听起来好像可以延长函数调用的生命周期。
  • @Cheersandhth.-Alf:可能只是锡它,虽然现在这个答案似乎有点太简短了。让我们看看社区的反应。
  • 我认为更清楚地说,如果对临时对象的引用与临时对象在同一范围内,则只能延长临时对象的生命周期。这使临时对象在作用域期间保持活动状态。在这里,在同一范围内没有引用,因此没有任何内容被扩展。
  • @NikosC.;是的,这更正确。虽然我希望会出现更全面的答案。
猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2013-01-25
  • 2020-11-03
相关资源
最近更新 更多