首页 > 解决方案 > 使用 std::mutex 复制省略

问题描述

这种复制省略的解释表明

在以下情况下,编译器必须省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察到的副作用。对象直接构建到存储中,否则它们将被复制/移动到。复制/移动构造函数不需要存在或可访问,因为语言规则确保不会发生复制/移动操作,即使在概念上也是如此:

在 return 语句中,当操作数是与函数返回类型相同的类类型(忽略 cv 限定)的纯右值时:

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

我的问题是为什么下面的代码不能编译:

#include <mutex>

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

int main()
{
    auto mutex = createMutex();
}

带有编译错误的示例程序。

标签: c++mutexcopy-elision

解决方案


我的问题是为什么下面的代码不能编译

因为你引用的参考资料说

(C++17 起)

它不适用于较旧的 C++ 标准。您使用 C++14 编译器编译了该程序。在 C++14 中,返回的对象是移动的,所以类型必须是可移动的,事实std::mutex并非如此。移动可以作为一种优化被忽略,但这种可能性并没有消除可移动性要求。

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


推荐阅读