错误C2582:'运营商='功能在'B'中不可用

Nor*_*rtM 5 c++ compiler-errors

以下代码为main()中的行"e = f"提供了编译错误(至少在使用MS VS 2008时):

错误C2582:'运营商='功能在'B'中不可用

class A {
public:
    A() { }
    static const double x;
};
const double A::x = 0.0;

class B {
public:
    B() : x(0.0) { }
    const double x;
};

int main( int argc, char *argv[] )
{
    A c,d;
    B e,f;

    c = d;
    e = f;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

应为两个类A和B生成默认赋值运算符!

在12.8.10中:"如果类定义没有显式声明一个复制赋值运算符,则会隐式声明一个."

Mik*_*our 16

隐式生成的运算符将递归地分配每个非静态成员.但是,xconst,因此无法分配.这可以防止生成隐式运算符(具体而言,它会将其定义为已删除).

这在C++ 11 12.8/23中指定:

如果X具有以下内容,则将类X的默认复制/移动赋值运算符定义为已删除:

  • ...
  • const非类型(或其数组)的非静态数据成员,或
  • ...

(虽然我只是注意到你的编译器早于C++ 11;规则是相似的,但是用不同的语言指定,在没有"删除"功能概念的旧方言中).

如果您想要一个无法重新分配其成员(或基类)的类的赋值运算符,则必须自己定义它.

class A,常量成员是静态的,因此不构成对象的一部分.因此,它不会阻止(空)对象被分配.