9

举个例子

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));
}

我认为这将是有效的代码,因为 anstd::move()只是 astatic_cast并且从我收集的所有函数参数中,首先评估所有函数参数(没有顺序保证),然后再复制/移动(我假设这是函数调用的一部分而不是参数评估)到函数的上下文。

4

1 回答 1

5

此代码有效。

正如你所说,std::move只是一个static_cast&&)。

表达方式:

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

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

事实上,对第二个论点std::move(a)的评估不会影响对第一个论点的评估。

移动操作”(此处意指“窃取”参数所持有的资源的操作)可能会在f(当所有参数都已评估时)的主体中发生。

于 2019-07-21T11:18:12.707 回答