由于某种原因,由于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;
}
标准不允许:
12) [...] 如果一个程序的副本的类是不正确的 赋值运算符隐式定义有:
类型的非静态数据成员,或const
- 引用类型的非静态数据成员,或者
- 具有不可访问的复制赋值运算符的类类型(或其数组)的非静态数据成员,或
- 具有不可访问的复制赋值运算符的基类。
[...]
强调我的。
所以你的程序格式不正确。通过不定义自己的赋值运算符,编译器会尝试隐式定义一个赋值运算符。
这是因为默认的赋值运算符(仅复制数据)不能用在“const”上。因此,对象不能只是盲目复制。