什么时候对函数参数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_castrvalue (&&).

表达式:

f(g(b, a), std::move(a));

不会导致未定义的行为,即使不能保证参数评估顺序。

确实,第二个参数的计算 std::move(a) 不会影响第一个参数的计算。

移动操作”(这里指的是 "stealing" 参数持有的资源的操作)可能发生在 [=15 的正文中=](当所有参数都已经被评估时)。