编译器警告(等级 4)C5267
已弃用“type”的隐式复制构造函数/赋值运算符的定义,因为它具有用户提供的赋值运算符/复制构造函数
备注
“C++ 标准”已弃用(但未删除)在某些情况下隐式生成复制和赋值运算符的功能。 MSVC 编译器在这些情况下仍生成复制和赋值运算符,但如果该标准删除了上述已弃用的行为,则此编译器将来可能会更改自己的行为。 此警告的目的是帮助将来证明你的代码(如果委员会决定删除此功能)。
C++ 标准中的相关部分包括:
- class.copy.ctor 第 6 段,其中指出:“如果类定义未显式声明一个复制构造函数,则会隐式声明一个非显式复制构造函数。 如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数会定义为已删除;否则它就是默认的。 后一种情况在类具有用户声明的复制赋值运算符或用户声明的析构函数时会被弃用。”
- 附件 D D.8,其中指出:“如果类具有用户声明的复制赋值运算符或用户声明的析构函数,则默认的复制构造函数的隐式定义会被弃用。 如果类具有用户声明的复制赋值运算符或用户声明的析构函数,则默认的复制构造函数的隐式定义会被弃用。 将来的 C++ 版本可能会明确说明这些隐式定义会被删除。”
示例
在调用一个已隐式生成但未显式定义的特殊函数时,以下代码会显示警告 C5267。 需要同时具有 /W4
和 /w45267
才能生成此警告。
// C5267.cpp
// compile using: /W4 /w45267
struct CopyCtorOnly
{
CopyCtorOnly() = default;
CopyCtorOnly(const CopyCtorOnly&) {} // C5267
};
struct CopyAssignOpOnly
{
CopyAssignOpOnly() = default;
CopyAssignOpOnly& operator=(const CopyAssignOpOnly&) // C5267
{
return *this;
}
};
int main()
{
CopyCtorOnly a1, a2;
a1 = a2; // Calls deprecated copy assignment operator
CopyAssignOpOnly b1;
CopyAssignOpOnly b2 = b1; // Calls deprecated copy constructor
}
若要解决此问题,请显式定义缺少的复制构造函数或复制赋值运算符。