簡體   English   中英

使用std :: mutex復制elision

[英]Copy elision with std::mutex

對復制省略的這種解釋說明了這一點

在下列情況下,編譯器需要省略復制和移動類對象的構造,即使復制/移動構造函數和析構函數具有可觀察到的副作用。 對象直接構造到存儲器中,否則它們將被復制/移動到存儲器中。 復制/移動構造函數不需要存在或可訪問,因為語言規則確保不會發生復制/移動操作,甚至在概念上:

在return語句中,當操作數是與函數返回類型相同的類類型(忽略cv-qualification)的prvalue時:

T f(){return T(); }
F(); //只調用一次T的默認構造函數

我的問題是為什么下面的代碼不能編譯呢:

#include <mutex>

std::mutex createMutex()
{
    return std::mutex();
}

int main()
{
    auto mutex = createMutex();
}

帶編譯錯誤的示例程序。

我的問題是為什么下面的代碼不能編譯呢

因為你引用的引用說

(自C ++ 17起)

它不適用於較舊的C ++標准。 您使用C ++ 14編譯器編譯了該程序。 在C ++ 14中,返回的對象被移動,因此類型必須是可移動的,而std::mutex則不是。 此舉可能被視為優化,但這種可能性並未消除可動性要求。

該示例在C ++ 17中構造良好,並將使用兼容的編譯器進行編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM