使用std :: mutex复制省略

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中格式正确,将使用兼容的编译器进行编译。