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();
}
答案 0 :(得分:10)
我的问题是,为什么下面的代码不能编译
因为引用的内容是
(自C ++ 17起)
它不适用于较早的C ++标准。您使用C ++ 14编译器编译了程序。在C ++ 14中,返回的对象已移动,因此类型必须是可移动的,而std::mutex
不可移动。 可能被认为是一种优化措施,但这种可能性并没有消除对移动性的要求。
该示例在C ++ 17中格式正确,将使用兼容的编译器进行编译。