C++:我应该在 return 语句中显式使用 std::move() 来强制移动吗?

C++: should I explicitly use std::move() in a return statement to force a move?

编辑:它不是重复的,因为这个问题询问的是编译器在 O0 中的决定。

据说 here 名称 Return 值优化 (NRVO) 是许多编译器支持的优化。但它是必须的还是只是一个可有可无的优化?

我的情况是,为了方便调试,我想用-O0编译(即不优化),但我也希望为return语句启用NRVO return 对象(比如,一个向量)。如果 NRVO 不是必须的,编译器可能不会在 -O0 模式下执行它。在这种情况下,我应该更喜欢这个代码:

std::vector<int> foo() {
    std::vector<int> v(100000,1); // an object that is really big..
    return std::move(v);  // explicitly move
}

下面这个?

std::vector<int> foo() {
    std::vector<int> v(100000,1);
    return v;    // copy or move?
}

编辑:我使用的编译器是 GCC6,但我希望代码独立于编译器。

你应该更喜欢

std::vector<int> foo() {
    std::vector<int> v(100000,1);
    return v;    // move or NRVO
}

超过

std::vector<int> foo() {
    std::vector<int> v(100000,1);
    return std::move(v);    // move
}

第二个片段阻止了 NRVO,在最坏的情况下,两者都会移动构造体。