3 回答

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
編譯器不會(huì)知道您要進(jìn)行指針比較還是深度(內(nèi)部)比較。
只執(zhí)行而不讓程序員自己做是比較安全的。然后他們可以做出所有喜歡的假設(shè)。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果編譯器可以提供默認(rèn)的副本構(gòu)造函數(shù),那么它應(yīng)該能夠提供類似的默認(rèn)值的說法operator==()具有一定意義。我認(rèn)為,決定不提供該運(yùn)算符生成的編譯器默認(rèn)值的原因可以由Stroustrup在“ C ++的設(shè)計(jì)和演變”(第11.4.1節(jié)-復(fù)制控制)中對(duì)默認(rèn)副本構(gòu)造函數(shù)的說明中得出。 :
我個(gè)人認(rèn)為很遺憾,默認(rèn)情況下定義了復(fù)制操作,并且禁止復(fù)制許多類的對(duì)象。但是,C ++從C繼承了其默認(rèn)賦值和復(fù)制構(gòu)造函數(shù),并且它們經(jīng)常使用。
因此operator==(),問題應(yīng)該是“為什么C ++具有默認(rèn)的賦值和復(fù)制構(gòu)造函數(shù)?”,而不是“為什么C ++沒有默認(rèn)的?”,答案是Stroustrup勉強(qiáng)地包含了這些項(xiàng),以實(shí)現(xiàn)與C的向后兼容性。 (可能是大多數(shù)C ++疣的原因,但也可能是C ++普及的主要原因)。
出于我自己的目的,在我的IDE中,我用于新類的代碼段包含一個(gè)私有賦值運(yùn)算符和復(fù)制構(gòu)造函數(shù)的聲明,因此,當(dāng)我生成一個(gè)新類時(shí),我沒有默認(rèn)的賦值和復(fù)制操作-我必須顯式刪除該聲明private:如果我希望編譯器能夠?yàn)槲疑蛇@些操作,請(qǐng)參閱本節(jié)中的這些操作。

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
即使在C ++ 20中,編譯器仍然不會(huì)operator==為您隱式生成
struct foo
{
std::string str;
int n;
};
assert(foo{"Anton", 1} == foo{"Anton", 1}); // ill-formed
但是您將擁有顯式默認(rèn)的功能==:
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;
};
默認(rèn)值==是按成員進(jìn)行的==(與默認(rèn)副本構(gòu)造函數(shù)按成員進(jìn)行復(fù)制的方式相同)。新規(guī)則還提供==和之間的預(yù)期關(guān)系!=。例如,使用上面的聲明,我可以同時(shí)編寫:
assert(foo{"Anton", 1} == foo{"Anton", 1}); // ok!
assert(foo{"Anton", 1} != foo{"Anton", 2}); // ok!
這種特殊的功能(默認(rèn)operator==和之間的對(duì)稱==和!=)來自一個(gè)建議,這是更廣泛的語言特點(diǎn),那就是的一部分operator<=>。
- 3 回答
- 0 關(guān)注
- 777 瀏覽
添加回答
舉報(bào)