出于某种原因,由于const字段_constFoo的初始化,编译器无法为此类生成operator =,我只想知道原因。使用VS2010。
class Foo {
public:
Foo(int f) : _constFoo(f) { }
int getFoo() const { return _constFoo; }
//void operator=(const Foo &f) { memcpy(this, &f, sizeof(Foo)); }
private:
const int _constFoo;
};
int main(int argc, char *argv[])
{
Foo f(5);
cout << f.getFoo() << endl;
f = Foo(6); //error C2582: 'operator =' function is unavailable in 'Foo'
cout << f.getFoo() << endl;
}
答案 0 :(得分:2)
标准不允许:
12)[...]如果复制的课程,程序是不正确的 赋值运算符是隐式定义的:
const
类型的非静态数据成员,或- 引用类型的非静态数据成员,或
- 具有无法访问的复制赋值运算符的类类型(或其数组)的非静态数据成员,或
- 具有无法访问的复制赋值运算符的基类。
[...]
强调我的。
所以你的程序是不正确的。通过不定义自己的赋值运算符,编译器会尝试隐式定义一个。
答案 1 :(得分:0)
那是因为默认赋值运算符只是复制数据,不能在“const”上使用。因此,不能盲目复制对象。