C++ 11是否使用移动语义来进行复制到分配优化?

gct*_*gct 1 c++ c++11

假设我有一个名为Foo的类,它定义了合适的移动构造函数/赋值运算符.给定以下伪代码:

Foo some_func(Foo var) { 
    <update var>
    return var;
}

int main() { 
    Foo var;
    var = some_func(var);
}
Run Code Online (Sandbox Code Playgroud)

将var传递给some_func时,C++ 11会自动使用移动语义,并再次重新分配给var,因为var的原始值会被销毁吗?我认为这将是一个安全的优化,它可以让你编写与传递引用/指针一样快的纯函数.如果做不到,为什么不呢?我知道它可以用std :: move强制,但如果是自动的话它会很酷.

Jon*_*ely 5

将var传递给some_func时,C++ 11会自动使用移动语义,

不,这是一个复制结构,因为它var是一个左值.

该语言不允许编译器执行任何其他操作.唯一一次隐式移动左值而不是复制左边是从函数返回它时,例如此行将some_func使用移动构造函数:

return var;
Run Code Online (Sandbox Code Playgroud)

并再次重新分配给var,因为var的原始值无论如何都会被销毁?

这将使用Foo的移动赋值运算符,因为它正在为r赋值var.

如果您使用过,some_func(std::move(var))或者如果您这样写,请避免使用任何副本:

Foo var = some_func({});
Run Code Online (Sandbox Code Playgroud)

这将创建一个初始化函数参数的临时函数,然后返回将使用移动的函数参数,然后var将移动构造,但可以省略移动.因此,允许编译器仅执行函数参数的默认构造和移动构造var.