使用std :: mutex复制省略

时间:2019-09-05 12:19:01

标签: c++ mutex copy-elision

This explanation of copy elision指出

  

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

     

在return语句中,当操作数是同一类的prvalue时   类型(忽略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.

1 个答案:

答案 0 :(得分:10)

  

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

因为引用的内容是

  

(自C ++ 17起)

它不适用于较早的C ++标准。您使用C ++ 14编译器编译了程序。在C ++ 14中,返回的对象已移动,因此类型必须是可移动的,而std::mutex不可移动。 可能被认为是一种优化措施,但这种可能性并没有消除对移动性的要求。

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