考慮以下類:
<code class="cpp">class X { public: explicit X(char* c) { cout << "ctor" << endl; init(c); }; X(X& lv) { cout << "copy" << endl; init(lv.c_); }; X(X&& rv) { cout << "move" << endl; c_ = rv.c_; rv.c_ = nullptr; }; const char* c() { return c_; }; private: void init(char *c) { c_ = new char[strlen(c)+1]; strcpy(c_, c); }; char* c_; };</code>
並且它的用法:
<code class="cpp">X x("test"); cout << x.c() << endl; X y(x); cout << y.c() << endl; X z( X("test") ); cout << z.c() << endl;</code>
輸出是:
ctor test copy test ctor <-- why not move? test
在VS2010 中,使用預設設置,人們會期望最後一個物件(z)是移動構造的而不是預設的-建造的。使用 X z( move(X("test")) ) 會產生預期的輸出:ctor move test。這可能是 NRVO 的情況嗎?
是否應該根據 C 11 標準呼叫移動構造函數?如果是這樣,為什麼不呼叫它?
觀察到的行為是由於複製省略造成的。編譯器可以直接將臨時物件建構到要複製/移動到的目標中,從而省略複製/移動建構函數和析構函數呼叫。
第 12.8 節中概述了可以應用複製省略的情況。 C 11 標準第 32 條:
在這種情況下,編譯器能夠省略臨時 X(「test」)和目標 z 之間的複製或移動操作,從而產生觀察到的行為。
以上是為什麼在這種情況下我的 C 11 Move 構造函數沒有被呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!