C ++:在传递std :: unique_ptr(仅移动类型)右值作为参数时复制省略号

Mik*_*ney 4 c++ c++11

std::unique_ptr由于复制省略,我能够将右值作为参数传递给如下所示的函数。副本是否一定会被C ++ 11标准淘汰,或者在某些实现中无法编译?

void take_unique_ptr_by_value(std::unique_ptr<int> sp) {
  cout << "Value is " << *sp.get() << std::endl;
}
// I am able to call the function above like this:
take_unique_ptr_by_value(std::make_unique<int>(3));
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 5

由于复制省略

不,这是因为move构造函数

此外,复制省略只是一种优化,仍然需要代码有效。所以

struct S
{
    S() = default;
    S(const S&) = delete;
    S(S&&) = delete;
};

S s = S(); // Won't compile prior C++17
Run Code Online (Sandbox Code Playgroud)

C ++ 17引入了“保证复制省略”(在某些情况下),从而消除了此限制。

有关copy_elision文档的更多详细信息