roz*_*ina 3 c++ mutex copy-elision
对复制省略的解释指出:
在以下情况下,即使复制/移动构造函数和析构函数具有明显的副作用,也要求编译器忽略类对象的复制和移动构造。这些对象直接构造到存储中,否则会将它们复制/移动到其中。复制/移动构造函数不需要存在或不可访问,因为语言规则可确保不会进行复制/移动操作,即使在概念上也是如此:
在return语句中,当操作数是与函数返回类型相同的类类型(忽略cv限定)的prvalue时:
T f(){返回T(); }
f(); //仅调用T的默认构造函数
我的问题是,为什么下面的代码不能编译:
#include <mutex>
std::mutex createMutex()
{
return std::mutex();
}
int main()
{
auto mutex = createMutex();
}
Run Code Online (Sandbox Code Playgroud)
eer*_*ika 10
我的问题是为什么下面的代码不能编译
因为您引用的参考说
(自C ++ 17起)
它不适用于较早的C ++标准。您使用C ++ 14编译器编译了程序。在C ++ 14中,返回的对象是移动的,因此类型必须是可移动的,而std::mutex不能移动。此举可能会被忽略,但这种可能性并不会消除对可移动性的要求。
该示例在C ++ 17中格式正确,将使用兼容的编译器进行编译。