由于复制省略,我能够将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));
答案 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非常全面。