Const字段中的初始化列表不生成operator =

时间:2012-08-25 22:29:17

标签: c++ visual-studio-2010 compiler-construction const initializer-list

出于某种原因,由于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;
}

2 个答案:

答案 0 :(得分:2)

标准不允许:

C ++ 03 12.8。复制对象

  

12)[...]如果复制的课程,程序是不正确的   赋值运算符是隐式定义的:

     
      
  • const类型的非静态数据成员,或
  •   
  • 引用类型的非静态数据成员,或
  •   
  • 具有无法访问的复制赋值运算符的类类型(或其数组)的非静态数据成员,或
  •   
  • 具有无法访问的复制赋值运算符的基类。
  •   
     

[...]

强调我的。

所以你的程序是不正确的。通过不定义自己的赋值运算符,编译器会尝试隐式定义一个。

答案 1 :(得分:0)

那是因为默认赋值运算符只是复制数据,不能在“const”上使用。因此,不能盲目复制对象。