c++ - 使用 std::mutex 复制省略
问题描述
在以下情况下,编译器必须省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察到的副作用。对象直接构建到存储中,否则它们将被复制/移动到。复制/移动构造函数不需要存在或可访问,因为语言规则确保不会发生复制/移动操作,即使在概念上也是如此:
在 return 语句中,当操作数是与函数返回类型相同的类类型(忽略 cv 限定)的纯右值时:
T f() { 返回 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 中格式良好,将使用兼容的编译器进行编译。
推荐阅读
- webpack - webpack 使用closure-webpack-plugin 而不是 google-closure-compiler
- spring-mvc - Spring Security antMatchers permitAll 不工作
- android-studio - How to detect Android Gradle dependencies that have newer versions available?
- c# - C# 获取作为项目的项目引用
- flutter - Validator 将 TextFormField 推到上面
- android - Unity Android 构建:通过 Chromecast 镜像时 Google Play 服务停止
- typescript - 正确的元组返回类型以避免非空/未定义的运算符?
- react-router - 反应路由器多个
- algorithm - 如何找到数据系列的趋势(增长/减少/平稳性)
- c++ - 使用 googletest 时针对 INSTANTIATE_TEST_SUITE_P 的 Visual Studio 2017 警告