繁体   English   中英

C ++:传递std :: unique_ptr(move-only type)rvalue作为参数时复制elision

[英]C++: Copy elision when passing std::unique_ptr (move-only type) rvalue as parameter

由于copy elision,我能够将std::unique_ptr rvalue作为参数传递给下面的函数。 是否保证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));

因为复制省略

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

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

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

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

C ++ 17引入了“保证副本省略”(在某些情况下),它消除了这种约束。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM