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}}
? 我的猜测是,当我调用向量构造函数时,它不能接受右值元素或什么?
谢谢。