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 關注
- 391 瀏覽
添加回答
舉報