【发布时间】:2014-09-30 13:35:37
【问题描述】:
在参数列表中的对象上操作是否安全,当该对象上还调用了 std::move() 时?
void foo(int* raw, std::unique_ptr<int> u)
{
*raw = 456;
}
std::unique_ptr<int> p(new int(123));
foo(p.get(), std::move(p));
如果 std::move(p) 被评估为第一个参数,那么 foo() 中的“原始”指针是否有效?
【问题讨论】:
-
考虑到参数的评估顺序没有指定并且可以以任何顺序发生,那么不,这不安全。如果首先评估
std::move操作,则p.get()将返回nullptr。 -
std::move什么都不做,所以这可能无关紧要。这是std::unique_ptr<int>的构造函数,隐式调用,具有破坏性。 -
@MarcAndreson 没错。 (我确实试图在我的评论中提到这一点。)我想指出这一点,因为如果你的函数有一个
std::unique_ptr<int> &&参数,那么绝对没有问题,即使调用看起来完全一样,包括 @987654330 @ 部分。
标签: c++ c++11 move-semantics