错误 C2582:"运算符 ="函数在"B"中不可用
error C2582: 'operator =' function is unavailable in 'B'
以下代码为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中:"如果类定义没有显式声明复制赋值运算符,其中一个是隐式声明的。"
隐式生成的运算符将递归地分配每个非静态成员。但是,x
是const
,因此它不能分配给。这会阻止隐式运算符的生成(特别是,它会导致它被定义为已删除)。
这在C++11 12.8/23:中有规定
如果X具有,则X类的默认复制/移动分配运算符被定义为已删除
- const非类类型的非静态数据成员(或其数组),或
(尽管我刚刚注意到您的编译器早于C++11;规则是相似的,但在不同的语言中指定,在没有"删除"函数概念的旧方言中)。
如果你想要一个不能重新分配成员(或基类)的类的赋值运算符,你必须自己定义它。
在class A
中,常量成员是静态的,因此不构成对象的一部分。因此,它不会阻止(空)对象被分配给.
字段'x'
是const double
的常量限定类型,默认赋值运算符将毫无意义,并被隐式删除此处
类A和B之间的明显区别是常量成员x是静态的还是非静态的。在任何情况下都不可能为常量变量赋值。
编译器显然试图为类B生成默认的赋值运算符方法,并默默地决定不生成一个,因为成员x不允许赋值。
我花了很长时间才发现。。。
BTW:若在类B中省略了x的初始化,编译器就足够聪明,可以发现这个错误。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 为什么在分配给引用时出现此错误(C2582:"运算符 ="函数在"B"中不可用)?
- std::矢量<A>错误 C2582:"运算符 ="函数在 中不可用
- 错误 C2582:"运算符 ="函数在 中不可用
- 错误 C2582:"运算符 ="函数在"B"中不可用
- 错误 C2582: 'operator ='函数不可用。(xutility)