[英]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.