Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::mutex复制省略_C++_Mutex_Copy Elision - Fatal编程技术网

C++ 使用std::mutex复制省略

C++ 使用std::mutex复制省略,c++,mutex,copy-elision,C++,Mutex,Copy Elision,声明 在下列情况下,编译器必须省略 类对象的复制和移动构造,即使复制/移动 构造函数和析构函数都有明显的副作用。这个 对象直接构造到存储中,它们将 否则将被复制/移动到。复制/移动构造函数不需要 存在或可访问,因为语言规则确保没有复制/移动 操作发生,甚至在概念上: 在return语句中,当操作数是同一类的prvalue时 类型(忽略cv限定)作为函数返回类型: tf(){返回T();} f();//只有一个对T的默认构造函数的调用 我的问题是为什么下面的代码没有编译: #include <

声明

在下列情况下,编译器必须省略 类对象的复制和移动构造,即使复制/移动 构造函数和析构函数都有明显的副作用。这个 对象直接构造到存储中,它们将 否则将被复制/移动到。复制/移动构造函数不需要 存在或可访问,因为语言规则确保没有复制/移动 操作发生,甚至在概念上:

在return语句中,当操作数是同一类的prvalue时 类型(忽略cv限定)作为函数返回类型:

tf(){返回T();}
f();//只有一个对T的默认构造函数的调用

我的问题是为什么下面的代码没有编译:

#include <mutex>

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

int main()
{
    auto mutex = createMutex();
}
#包括
std::mutex createMutex()
{
返回std::mutex();
}
int main()
{
自动互斥=createMutex();
}

我的问题是为什么下面的代码没有编译

因为你引用的参考资料说

(从C++17开始)

不适用于旧的C++标准。您使用C++14编译器编译了该程序。在C++14中,返回的对象是移动的,因此类型必须是可移动的,而

std::mutex
不是。移动可以省略为优化,但这种可能性并不能消除移动性要求


该示例在C++17中格式良好,将使用兼容的编译器进行编译。

mutex作为返回值?沃特?你做错了什么事。@MarekR我不这么认为。@StaceyGirl在我写评论的时候我仍然有暂停时间。Ofc我会得到一个好答案!