在C++中,是否保证在销毁函数中的自动变量之前创建返回值?通知篮::get:
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的同时调用损坏。
我的测试表明,礼物副本确实是在锁销毁之前创建的,然而,它是有保证的吗?如果没有,我将需要在函数内部创建第二个临时函数,例如:
Gift get ()
{
Gift result;
{
Lock lock(mutex);
result = gift;
}
return result;
}
发布于 2011-12-09 05:28:58
是的,auto变量将保留在作用域中,直到返回完成。如果您正在使用优化return
的编译器,这一点尤其正确,例如:
Gift get()
{
Lock lock(mutex);
return gift;
}
Gift g = basket.get();
它等同于这个序列:
Gift g;
Lock lock(mutex);
g = Gift(gift);
lock.~Lock();
可能会被优化为更像这样运行:
void get(Gift &ret)
{
Lock lock(mutex);
ret = gift;
}
Gift g;
basket.get(g);
它等同于这个序列:
Gift g;
Lock lock(mutex);
g = gift;
lock.~Lock();
换句话说,可以在return
期间删除临时对象。
发布于 2011-12-09 05:25:23
这是有保证的。在销毁发生之前,会复制返回值(如果需要)。这里有一个类似的问题/答案,对序列进行了很好的描述。
https://stackoverflow.com/questions/8437763
复制相似问题