c++ - 下面的 std::move 是多余的吗?

标签 c++ move

下面的 std::move 是多余的吗?

std::string member;

obj(std::initializer_list<std::string> p_list)
    : member {std::move(join(p_list))}
{}

这是连接函数:

std::string join(string_initializer_list p_list) {
    size_t size {};
    for (auto const & s : p_list) {
        size += s.size();
    }
    std::string output;
    output.reserve(size);
    for (auto const & s : p_list) {
        output.append(s);
    }
    return output;
}

最佳答案

不,你不需要std::movestd::move 的功能是将任何值转换为右值。您的函数已经返回一个右值,因此就将结果绑定(bind)到引用而言,强制转换没有任何效果(这是您从右值初始化 member 所追求的)。

事实上,主动使用std::move抑制复制省略,所以它是一个严格的悲观化:

std::string s = join({});             // construct from prvalue, elidable,
                                      // elision mandatory in C++17

std::string s = std::move(join({}));  // temporary object must be constructed,
                                      // s is initialized by moving from the
                                      // temporary

第一种形式std::string s = join({});,copy elision是指直接构造join的返回对象代替s(没有构造临时对象,只做copy或move),而且函数体中的output变量也被省略,直接在返回值中构造,即在 s 中。对于 std::move,第一个省略步骤不可用。

关于c++ - 下面的 std::move 是多余的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900883/

相关文章:

c++ - boost 线程错误 : undefined reference

c++ - 当我的代码被 GCC 编译时内存泄漏

c++ - 设计一个可以与其他库相互转换的类

c++ - 在指针成员之前调用非指针成员的析构函数

c++ - 如何在 Netbeans C++ IDE 中获取堆栈跟踪

c++ - C++中是否允许自 move 对象?

function - 在 Rust 中实际需要 move 到函数的情况

linux - Bash: move 文件/目录并创建它的链接

java - 在 Java 中如何将文件从一个位置 move 到另一个位置?

rust - move 原始实例后,不会反射(reflect)使用字段可变引用的更改