编译器警告(等级 4)C4512
“class”:无法生成赋值运算符
编译器无法为给定的类生成赋值运算符。 未创建任何赋值运算符。
派生类不可访问的基类的赋值运算符可导致此警告。
若要避免此警告,请为类指定用户定义的赋值运算符。
编译器还会为不会定义此函数的类生成一个赋值运算符函数。 此赋值运算符是对象的数据成员的成员复制。 因为无法在初始化之后修改 const
数据项,所以如果类包含 const
项,则默认赋值运算符将不起作用。 出现C4512 警告的另一个原因是声明了引用类型的非静态数据成员。 如果这样做是为了创建一个非可复制的类型,则还必须防止创建默认复制构造函数。
可使用以下三种方式之一解决代码的 C4512 警告:
显式定义类的赋值运算符。
从类中的数据项中移除
const
或引用运算符。使用 #pragma 警告语句取消警告。
示例
以下示例生成 C4512。
// C4512.cpp
// compile with: /EHsc /W4
// processor: x86
class Base {
private:
const int a;
public:
Base(int val = 0) : a(val) {}
int get_a() { return a; }
}; // C4512 warning
class Base2 {
private:
const int a;
public:
Base2(int val = 0) : a(val) {}
Base2 & operator=( const Base2 & ) { return *this; }
int get_a() { return a; }
};
// Type designer intends this to be non-copyable because it has a
// reference member
class Base3
{
private:
char& cr;
public:
Base3(char& r) : cr(r) {}
// Uncomment the following line to explicitly disable copying:
// Base3(const Base3&) = delete;
}; // C4512 warning
int main() {
Base first;
Base second;
// OK
Base2 first2;
Base2 second2;
char c = 'x';
Base3 first3(c);
Base3 second3 = first3; // C2280 if no default copy ctor
}