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)
由于复制省略
不,这是因为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文档的更多详细信息