在C++中,函數中的自動變量被銷燬之前,是否會保證創建一個返回值?通知籃::獲得:自動變量銷燬之前或之後創建的C++返回值?
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 get()
{
Gift result;
{
Lock lock(mutex);
result = gift;
}
return result;
}
在C++標準中沒有寄存器這樣的東西。 (好吧,有'register'關鍵字,但很久以前它就失去了它的含義。)另外,大多數對象都不適合單個寄存器。 – fredoverflow
如果返回一個本地對象,那麼當然,它必須在它被銷燬之前被複制。但是,這是另一回事。我有一個返回類的數據成員,所以複製發生時的語義似乎不同。 – maxpolk
@maxpolk您正在通過值返回成員。除非編譯器可以像Remy所顯示的那樣將其優化爲參考任務,否則將會有一個副本。如果你正在返回一個引用或指針,那麼鎖之後仍然會被銷燬。 – AJG85