3 回答
TA贡献1826条经验 获得超6个赞
如果编译器可以提供默认的副本构造函数,那么它应该能够提供类似的默认值的说法operator==()具有一定意义。我认为,决定不提供该运算符生成的编译器默认值的原因可以由Stroustrup在“ C ++的设计和演变”(第11.4.1节-复制控制)中对默认副本构造函数的说明中得出。 :
我个人认为很遗憾,默认情况下定义了复制操作,并且禁止复制许多类的对象。但是,C ++从C继承了其默认赋值和复制构造函数,并且它们经常使用。
因此operator==(),问题应该是“为什么C ++具有默认的赋值和复制构造函数?”,而不是“为什么C ++没有默认的?”,答案是Stroustrup勉强地包含了这些项,以实现与C的向后兼容性。 (可能是大多数C ++疣的原因,但也可能是C ++普及的主要原因)。
出于我自己的目的,在我的IDE中,我用于新类的代码段包含一个私有赋值运算符和复制构造函数的声明,因此,当我生成一个新类时,我没有默认的赋值和复制操作-我必须显式删除该声明private:如果我希望编译器能够为我生成这些操作,请参阅本节中的这些操作。
TA贡献1862条经验 获得超7个赞
即使在C ++ 20中,编译器仍然不会operator==为您隐式生成
struct foo
{
std::string str;
int n;
};
assert(foo{"Anton", 1} == foo{"Anton", 1}); // ill-formed
但是您将拥有显式默认的功能==:
struct foo
{
std::string str;
int n;
// either member form
bool operator==(foo const&) const = default;
// ... or friend form
friend bool operator==(foo const&, foo const&) = default;
};
默认值==是按成员进行的==(与默认副本构造函数按成员进行复制的方式相同)。新规则还提供==和之间的预期关系!=。例如,使用上面的声明,我可以同时编写:
assert(foo{"Anton", 1} == foo{"Anton", 1}); // ok!
assert(foo{"Anton", 1} != foo{"Anton", 2}); // ok!
这种特殊的功能(默认operator==和之间的对称==和!=)来自一个建议,这是更广泛的语言特点,那就是的一部分operator<=>。
- 3 回答
- 0 关注
- 366 浏览
添加回答
举报