为什么在此设置中未调用move构造函数?

时间:2019-01-21 18:30:48

标签: c++ vector

UPD:链接重复的问题确实可以解决问题。谢谢大家的建议。

假设我有以下课程:

class NonCopyableInt {
public:
    NonCopyableInt(const int &source) : data{source} {

    }

    NonCopyableInt(const NonCopyableInt &val) = delete;

    void operator=(const NonCopyableInt &other) = delete;

    NonCopyableInt(NonCopyableInt &&val) {
        data = val.data;
    }

    int data;
};

现在,我以这种方式使用它:

template<typename T>
ostream &operator<<(ostream &os, const vector<T> &vec) {
    for (const auto &v : vec) {
        os << v << " ";
    }
    return os;
}

ostream &operator<<(ostream &os, const NonCopyableInt &v) {
    os << v.data << " ";
    return os;
}    

int main(){
        {
            cout << "partial move" << endl;
            vector<NonCopyableInt> v;
            v.push_back(NonCopyableInt(1));
            v.push_back(NonCopyableInt(2));
            v.push_back(NonCopyableInt(3));
            v.push_back({3});

            vector<NonCopyableInt> vref;

            cout << v << endl;
            cout << vref << endl;

            vref.push_back(move(v[0]));
            v.clear();

            cout << v << endl;
            cout << vref << endl;
        }

        return 0;
    }

这完全正常,并且符合预期。我能够在矢量之间移动对象而无需复制它们。但是,这是我的问题:

我为什么可以这样做:

v.push_back({3});

但是不能这样做(导致以下编译错误:error: call to deleted constructor of 'NonCopyableInt'):

vector<NonCopyableInt> v{{1},{2}}

? 我的猜测是,当我调用向量构造函数时,它不能接受右值元素或什么?

谢谢。

0 个答案:

没有答案