什么时候对函数参数c ++执行移动操作
When is a move operation performed on a function argument c++
举个例子
void f(B b, A&& a) {...}
B g(B b, A a) {...}
int main() {
B b;
A a;
f(g(b, a), std::move(a));
}
我认为这是有效的代码,因为 std::move()
只是一个 static_cast
,据我所知,在复制/移动之前首先评估所有函数参数(没有顺序保证)(我假设这是函数调用的一部分而不是参数评估)到函数的上下文。
此代码有效。
如您所说,std::move
只是 static_cast
到 rvalue (&&
).
表达式:
f(g(b, a), std::move(a));
不会导致未定义的行为,即使不能保证参数评估顺序。
确实,第二个参数的计算 std::move(a)
不会影响第一个参数的计算。
“移动操作”(这里指的是 "stealing" 参数持有的资源的操作)可能发生在 [=15 的正文中=](当所有参数都已经被评估时)。
举个例子
void f(B b, A&& a) {...}
B g(B b, A a) {...}
int main() {
B b;
A a;
f(g(b, a), std::move(a));
}
我认为这是有效的代码,因为 std::move()
只是一个 static_cast
,据我所知,在复制/移动之前首先评估所有函数参数(没有顺序保证)(我假设这是函数调用的一部分而不是参数评估)到函数的上下文。
此代码有效。
如您所说,std::move
只是 static_cast
到 rvalue (&&
).
表达式:
f(g(b, a), std::move(a));
不会导致未定义的行为,即使不能保证参数评估顺序。
确实,第二个参数的计算 std::move(a)
不会影响第一个参数的计算。
“移动操作”(这里指的是 "stealing" 参数持有的资源的操作)可能发生在 [=15 的正文中=](当所有参数都已经被评估时)。