[英]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.