C++ 11从参数初始化数据成员的方法

som*_*guy 20 c++ initialization c++11

看作C++ 11支持移动语义,当从参数初始化数据成员时,我们是否应该尝试移动值而不是复制它?

这是一个示例,展示了如何在C++ 11之前解决这个问题:

struct foo {
    std::vector<int> data;

    explicit foo(const std::vector<int>& data)
        : data(data)
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

这里,将调用复制构造函数.

在C++ 11中,我们是否应该养成这样写的习惯:

struct foo {
    std::vector<int> data;

    explicit foo(std::vector<int> data)
        : data(std::move(data))
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

这里,移动构造函数将被调用...以及复制构造函数(如果传递的参数是左值),但好处是如果传递了右值,则将调用移动构造函数而不是复制构造函数.

我想知道是否有我遗漏的东西.

Ren*_*ter 8

我对你问题的初步回答是:

不要复制要移动的数据.如果性能有问题,可以使用右值引用添加构造函数:

explicit foo(std::vector<int>&& data)
    : data(std::move(data))            // thanks to Kerrek SB
{
}
Run Code Online (Sandbox Code Playgroud)

不完全匹配你的问题,但阅读 三阶规则成为C++ 11的五法则? 似乎很有用.

编辑:

但是,C++ 0x中构造函数的传递/移动参数的接受答案 似乎提倡您的方法,尤其是对于多个参数.否则就会出现组合爆炸的变种.

  • 不过你还是要说'data(std :: move(data))`! (3认同)