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

时间:2019-05-15 08:04:54

标签: 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));

2 个答案:

答案 0 :(得分:5)

  

由于复制省略

不,这是因为移动了构造函数

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

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

S s = S(); // Won't compile prior C++17

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

有关copy_elision's doc的更多详细信息

答案 1 :(得分:0)

要像@ Jarod42所提到的那样,即使要进行复制省略,也要更明确地拼凑一些答案,但仍然必须存在被删除的复制/移动构造函数。其次,我忘记的是我传递的参数是一个右值,因此如果需要“复制”它会调用move构造函数。因此,复制省略或示例代码是否正确,因为std::unique_ptr有一个move构造函数,而我正在传递一个右值。其他answer非常全面。