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
隐式生成的运算符将递归地分配每个非静态成员.但是,x是const,因此无法分配.这可以防止生成隐式运算符(具体而言,它会将其定义为已删除).
这在C++ 11 12.8/23中指定:
如果X具有以下内容,则将类X的默认复制/移动赋值运算符定义为已删除:
- ...
- const非类型(或其数组)的非静态数据成员,或
- ...
(虽然我只是注意到你的编译器早于C++ 11;规则是相似的,但是用不同的语言指定,在没有"删除"功能概念的旧方言中).
如果您想要一个无法重新分配其成员(或基类)的类的赋值运算符,则必须自己定义它.
在class A,常量成员是静态的,因此不构成对象的一部分.因此,它不会阻止(空)对象被分配.