错误 C2582:"运算符 ="函数在"B"中不可用

error C2582: 'operator =' function is unavailable in 'B'

本文关键字:函数 C2582 运算符 错误      更新时间:2023-10-16

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

错误C2582:"operator="功能在"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;
}

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

在12.8.10中:"如果类定义没有显式声明复制赋值运算符,其中一个是隐式声明的。"

隐式生成的运算符将递归地分配每个非静态成员。但是,xconst,因此它不能分配给。这会阻止隐式运算符的生成(特别是,它会导致它被定义为已删除)。

这在C++11 12.8/23:中有规定

如果X具有,则X类的默认复制/移动分配运算符被定义为已删除

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

(尽管我刚刚注意到您的编译器早于C++11;规则是相似的,但在不同的语言中指定,在没有"删除"函数概念的旧方言中)。

如果你想要一个不能重新分配成员(或基类)的类的赋值运算符,你必须自己定义它。

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

字段'x'const double的常量限定类型,默认赋值运算符将毫无意义,并被隐式删除此处

类A和B之间的明显区别是常量成员x是静态的还是非静态的。在任何情况下都不可能为常量变量赋值。

编译器显然试图为类B生成默认的赋值运算符方法,并默默地决定不生成一个,因为成员x不允许赋值。

我花了很长时间才发现。。。

BTW:若在类B中省略了x的初始化,编译器就足够聪明,可以发现这个错误。