在对另一个问题的评论中, Jonathan Wakely 回应了我的陈述:
对于局部变量函数的返回值,您永远不需要显式移动。这是隐含的举动
->
...永远不要说永远...如果局部变量与返回类型的类型不同,则需要显式移动,例如
std::unique_ptr<base> f() { auto p = std::make_unique<derived>(); p->foo(); return p; }
,但如果类型相同,它会尽可能移动...
所以有时我们可能不得不在返回时移动一个局部变量。
这个例子
std::unique_ptr<base> f() {
auto p = std::make_unique<derived>();
p->foo();
return p;
}
很好,因为它给出了编译错误
> prog.cpp:10:14: error: cannot convert ‘p’ from type
> ‘std::unique_ptr<derived>’ to type ‘std::unique_ptr<derived>&&’
但我想知道一般来说是否有很好的机会检测到这一点 -这是语言规则的限制还是unique_ptr
?