首页 > 解决方案 > 可以从私有构造函数/赋值运算符更改为已删除破坏二进制兼容性吗?

问题描述

使用 C++11。

我有一个类,我想通过进行以下更改来清理一下:

class MyClass {
public:
  // code
private:
  MyClass(const MyClass&);
  MyClass& operator=(const MyClass&);
  // members
};

class MyClass {
public:
  // code
  MyClass(const MyClass&) = delete;
  MyClass& operator=(const MyClass&) = delete;
private:
  // members
};

知道两者都已声明但未定义,此更改会破坏二进制兼容性吗?它有什么改善吗?

标签: c++c++11binary-compatibility

解决方案


如果您从第一个版本切换到第二个版本,您可以访问、用户声明、删除的构造函数,这样的代码将在 C++11 中编译:

MyClass b{};

但是如果你升级到 C++20,它就不会了。那可能不是你想要的。如果您坚持使用无法访问构造函数的第一个版本,则声明b不会在任何语言版本中编译,因此您至少不会遇到此问题。

这是一个演示


推荐阅读