【问题标题】:Copy elision with std::mutex使用 std::mutex 复制省略
【发布时间】:2019-09-05 12:19:01
【问题描述】:

This explanation of copy elision 声明

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

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

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

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

#include <mutex>

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

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

Example program with compile errors.

【问题讨论】:

  • mutex 作为返回值?笏?你做错了什么。
  • @MarekR 我不这么认为。

标签: c++ mutex copy-elision


【解决方案1】:

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

因为你引用的参考资料说

(C++17 起)

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

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

【讨论】:

  • @StaceyGirl 我写评论时仍然有超时。我会接受一个好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2017-03-28
  • 2021-02-08
  • 2013-12-29
相关资源
最近更新 更多