首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++返回值是在自动变量销毁之前还是之后创建的?

C++返回值是在自动变量销毁之前还是之后创建的?
EN

Stack Overflow用户
提问于 2011-12-09 05:15:00
回答 2查看 3.4K关注 0票数 24

在C++中,是否保证在销毁函数中的自动变量之前创建返回值?通知篮::get:

代码语言:javascript
复制
class Basket
{
public:
  // Gift is a struct containing safely copyable things like int or string
  Gift gift;
  // Used to protect access and changes to gift
  Mutex mutex;

  // Copy gift into present, while locked to be thread safe
  void put (const Gift & gift)
  {
    Lock lock(mutex);   // Constructor locks, destructor unlocks mutex
    this->gift = gift;  // Gift assignment operator
  }

  // Return a memberwise-copy of gift, tries to be thread safe (but is it?)
  Gift get ()
  {
    Lock lock(mutex);  // Constructor locks, destructor unlocks mutex
    return gift;       // Gift copy constructor
  }
};

我需要在销毁锁对象之前执行它的Gift copy构造函数(返回的temp对象的)。否则,返回的礼物对象可能会被对put的同时调用损坏。

我的测试表明,礼物副本确实是在锁销毁之前创建的,然而,它是有保证的吗?如果没有,我将需要在函数内部创建第二个临时函数,例如:

代码语言:javascript
复制
  Gift get ()
  {
    Gift result;
    {
      Lock lock(mutex);
      result = gift;
    }
    return result;
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-09 05:28:58

是的,auto变量将保留在作用域中,直到返回完成。如果您正在使用优化return的编译器,这一点尤其正确,例如:

代码语言:javascript
复制
Gift get() 
{ 
    Lock lock(mutex);
    return gift;
} 

Gift g = basket.get();

它等同于这个序列:

代码语言:javascript
复制
Gift g;
Lock lock(mutex);
g = Gift(gift);
lock.~Lock();

可能会被优化为更像这样运行:

代码语言:javascript
复制
void get(Gift &ret) 
{ 
    Lock lock(mutex);
    ret = gift;
} 

Gift g;
basket.get(g);

它等同于这个序列:

代码语言:javascript
复制
Gift g;
Lock lock(mutex);
g = gift;
lock.~Lock();

换句话说,可以在return期间删除临时对象。

票数 20
EN

Stack Overflow用户

发布于 2011-12-09 05:25:23

这是有保证的。在销毁发生之前,会复制返回值(如果需要)。这里有一个类似的问题/答案,对序列进行了很好的描述。

Scope and return values in C++

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8437763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档