【问题标题】:When is a move operation performed on a function argument c++何时对函数参数c ++执行移动操作
【发布时间】:2019-11-29 14:50:26
【问题描述】:

举个例子

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

【问题讨论】:

  • 这与operator-precedence无关。
  • @user207421 不幸的是,SO 上的 operator-precedence 标记确实搞砸了。它有一个错误的定义,别名为evaluation-order,这与这里真正相关。

标签: c++ move-semantics order-of-execution


【解决方案1】:

此代码有效。

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

表达式:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    相关资源
    最近更新 更多