《C Primer》這裡是寫錯了嗎?

時間 2022-01-20 23:01:17

1樓:波西公尺亞程式設計師

我狂看了兩個小時N4860.pdf,雖然還是不很肯定,但感覺C++ Primer裡確實寫的不合適。

不過spec裡的這一部分(11.4.4.2附近)確實令人非常頭疼。唉……我目前只能這樣解釋:

只有編譯器在選擇(overload resolution)子物件(subobject)的複製/移動建構函式時發生歧義,或者找到的候選函式沒有許可權訪問,這時預設移動建構函式才會被自動定義為「deleted」。

(子物件在這裡指基類)

而當基類有析構函式時,其移動建構函式不會被自動生成(synthesized),這意味著「沒有」,而不是「有,但是不能用」。因此當選擇子物件的複製/移動建構函式時,其複製建構函式作為「矮子裡拔將軍」,就被選中了。(當然更不存在歧義)

所以如果籠統的說「只要基類沒有移動建構函式,則子類就也不會有自動生成的移動建構函式」,這話就不夠準確了。

2樓:DCBA

我感覺英文版想說的是大多數基類都會定義乙個虛析構函式,所以也就是有乙個user-declared destructor,那麼就沒有預設的move操作了,所以你需要在基類裡定義乙個move,以確保派生類的move呼叫了基類的move操作而不是copy constructor。

這個虛析構函式和阻止子類合成沒有關係,他只是讓你注意一下基類一般有乙個user-declared destructor。

3樓:吳詠煒

你的理解是正確的。C++ Primer 裡的陳述看起來確實是錯的。還是以 C++ 規範或者 cppreference 為準吧。

cppreference 上是這麼描述的:

「如果不對類型別(struct、class 或 union)提供任何使用者定義的移動建構函式,且滿足下列所有條件:

沒有使用者宣告的複製建構函式;

沒有使用者宣告的複製賦值運算子;

沒有使用者宣告的移動賦值運算子;

沒有使用者宣告的析構函式;

那麼編譯器將宣告乙個移動建構函式作為這個類的非 explicit 的 inline public 成員,簽名為 T::T(T&&)。 」

C++ 規範裡的陳述基本也就是這個樣子。在 C++20 裡是在 §11.4.4.2。

父類沒有移動建構函式意味著在子類的移動構造裡父類物件的部分只能做拷貝構造,但這不影響子類裡的其他成員變數可以進行移動操作。

這裡是緬甸北部 是什麼梗?

噼里啪啦辭火樺 就是乙個網文裡面的梗,書內三觀盡毀,是13年的書,然後現在不知道怎麼的書裡這句話就火起來了,一堆人想去緬甸北部看看。其實也可以,你想去送s也沒人攔你 另外你可以當做梗去玩,但是當你說出,你也想去陸進生活的緬甸北部看看,你也想去金三角看看的那些,八成沒救了,父母趕緊帶去看下神經外科。 ...

請問三為什麼這裡是vital to doing

雷老師 to一般認為有兩種用法 一種是當介詞,表示方向性,介詞後面應該跟名詞如go to school,go to bed另一種是跟動詞原形形成動詞不定式to do這時候to也不知道是個啥屬性的詞,就是乙個結構性詞彙但是後面跟動詞原形是肯定的了 如want to die,hope to eat不定式...

為什麼日語 在這裡是強調主語?

新醬 這是初級日語中的乙個語法問題。問 範圍 疑問詞 形容詞 答 形容詞 首先 季節 中 好 中的 這兒是一定要用 的。不用去糾結為什麼用 不用 只要記住日語中疑問詞後面要用 提示,不能用 然後 春 好 中,如果你糾結 和 日語中 的句子強調的是前面,也就是題主所說的強調主語。而 則更強調後半部。或...