標籤:

這段c++代碼是移動操作嗎?

在看《c++程序設計語言》,看到這麼一段代碼:

這裡v2不是引用嗎,為什麼能把vs移動到v2?


不是,這段代碼編譯報error。

non-const lvalue reference只能綁定到左值。

std::move的結果是xvalue。

查了一下英文原書,原書上也是這麼印的:

但是上網查一下errata: http://www.stroustrup.com/4th_printing3.html

P.S. 關於msvc沒報錯的問題:

這是msvc不遵守標準的擴展,在/Wall 和/W4 下報warning,用/permissive- 或者/Za( disable extensions)可以報error。(感謝評論區 @d41d8c 的指正)

我非常確定按照C++標準,加那個代碼應該被reject(我上面po出的代碼,函數參數不是ref,不過這個對callee來說基本沒有區別)。谷歌了一下,我找到了這個

https://stackoverflow.com/questions/16493524/is-it-valid-to-bind-non-const-lvalue-references-to-rvalues-in-c-11modified

https://stackoverflow.com/questions/7189420/one-vs2010-bug-allowing-binding-non-const-reference-to-rvalue-without-even-a-w?rq=1


更新一下:思維慣性想當然了,這個代碼是不對的,右值值不能綁定到左值引用

所以應該是打錯字了,多打了個

原答案:

move只是把對象轉型成右值引用,並不實際執行移動操作

然後右值引用和左值引用都是可以綁定給左值引用的

所以寫不寫move沒有區別

當然我覺得多半是v2多打了個


Move只是轉類型。。。


vector& v2 = move(vs);

這樣是一樣的,

vector& v2 = vs;


std::move used to indicate that an object t may be "moved from", i.e. allowing the efficient transfer of resources from t to another object.

然後vector又定義了移動構造函數

vector( vector other );


推薦閱讀:

私自將書中函數代碼編寫出來放到網上分享侵權嗎?
如何評價《自由軟體世界裡的「版權勒索」》?
如果你不用殺毒軟體,能殺毒,弄木馬么?需要不靠軟體去殺毒殺木馬,需要什麼水平或者會什麼?
如何只用16進位編輯器寫出hello_world.exe?
許嵩寫代碼的水平如何?

TAG:編程 | 代碼 | C |