何时对函数参数执行移动操作 c++

问题描述 投票:0回答:2

以为例

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
并且根据我收集的信息,在复制/移动之前首先评估所有函数参数(没有顺序保证)(我认为这是函数的一部分)调用而不是参数评估)到函数的上下文。

c++ move-semantics order-of-execution
2个回答
5
投票

此代码有效。

正如您所说,

std::move
只是
static_cast
rvalue
&&
)。

表达方式:

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

不会导致未定义的行为,即使参数求值顺序无法保证。

确实,第二个参数

std::move(a)
的评估不会影响第一个参数的评估。

移动操作”(这里的意思是“窃取”参数所持有的资源的操作)是在

f
的主体中发生的事情(当所有参数都已被评估时)。


0
投票

f() 的末尾发生了什么? ~A() 被调用了吗?

© www.soinside.com 2019 - 2024. All rights reserved.