繁体   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