【发布时间】:2013-07-21 09:34:05
【问题描述】:
我有一个关于我们可以存储在向量中的类的问题。 可以存储在向量中的要求是什么? 似乎这样的类必须有赋值运算符。但我不确定是否仅此而已。
让我举个例子。 A 类具有 const int 成员。如果我不写 operator =,它就不会编译。但是在这个例子中,这个操作符什么都不做。该程序正确显示 10 和 20。看起来 operator = 是必需的,但实际上并未使用。
#include <iostream>
#include <vector>
class A {
public:
A(int a) : a_(a) {}
A& operator =(const A& a2) { return *this;} // Without this, compile fails.
void print() const {
std::cerr << a_ << std::endl;
}
private:
const int a_;
};
int main(int argc, char** argv) {
std::vector<A> v;
v.push_back(A(10));
v.push_back(A(20));
for (const A& a : v) a.print();
}
【问题讨论】:
-
你需要一个拷贝构造函数或者一个移动构造函数。
-
它在VS2012和Gcc 4.8上编译,你用的是哪个编译器?
-
@Rapptz 我实际上发现你需要复制构造函数和复制赋值,或者移动构造函数和移动赋值。 VS2012 在内部使用复制/移动构造函数。 GCC 似乎想要复制/移动分配。
-
@Mysticial Works fine for me
-
@Rapptz 嗯...我在
std::vector中有一个对象,它具有移动构造函数,但没有移动分配。它在 VS2012 中编译,但在 GCC 中出现链接器错误(特别是因为缺少移动分配)。虽然我怀疑这是否重要,但我认为我使用的是 GCC 4.6。