【发布时间】:2020-12-02 15:41:38
【问题描述】:
使用 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++11 特性提高源代码的清晰度和可读性,这些特性为我的代码增加了表现力,所有这些都不会破坏任何类型的兼容性。虽然人们可以期待一个私有复制构造函数的定义,但将其标记为删除对于不可复制的意图非常清楚。
-
@JosephLarson 这只是一个假设,但我希望如果在某处调用函数,更改函数签名会导致二进制不兼容。在这里,在这两种情况下,函数可能不会在生成的程序集中的任何地方调用(在第一种情况下会导致未定义的引用)。
标签: c++ c++11 binary-compatibility