常量字段中的初始化列表不会生成运算符=

问题描述 投票:0回答:2

由于某种原因,由于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;
}
c++ visual-studio-2010 constants initializer-list
2个回答
2
投票

标准不允许:

C++03 12.8。复制对象

12) [...] 如果一个程序的副本的类是不正确的 赋值运算符隐式定义有:

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

[...]

强调我的。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.