std move為什麼能當成右值使用?

時間 2021-09-09 10:07:05

1樓:Tex

::std::move 本質上是個強制型別轉換。

新型別為乙個右值型別。這樣在編譯時編譯器會呼叫引數型別為右值的相應函式,而不會呼叫引數型別為左值的函式,可以理解為編譯期發生的dispatch

2樓:小明

遇事不決,cppreference

如果還要深入,就不要糾結「右值引用是左值」,而是把「右值引用」形式的返回值當做返回乙個movable語義,語法糖罷了。

3樓:Tanki Zhang

想清楚這個以及一系列的問題,關鍵要理解 Value category。我這裡 cite 一句:

a cast expression to rvalue reference to object type, such as static_cast(x);

這是 xvalue 的一種情況。(https://

)xvalue 的重要性質是可以被視作 rvalue 或者 glvalue。

所以 std::move 為什麼能那麼實現就非常自然了。

4樓:黃亮anthony

std:: move能生成右值的原因是函式呼叫表示式是乙個右值,和實現裡面的轉型沒關係。

T&&是右值引用,但它可以是左值。

比如int&& a,a就是乙個左值。

為什麼改成static_cast也行,是因為轉型表示式也是乙個右值。效果相同但是不等同,因為不是所有move的引數都可以轉型

5樓:胖子

首先給出通俗的解釋。如下,

"引用"只是別名而已,在cast過程中不會有拷貝動作,而只是對輸入的變數進行重新解釋。

好比你有一部手機,你可以把它當成通訊工具。也可以把它當成遊戲機。也可以把它當成記事本。就看你怎麼理解它而已。

然後是常規的解釋。

這裡涉及到2個概念。乙個是表示式的左右值屬性。乙個是函式過載解析。

乙個表示式要麼是左值,要麼是右值。

乙個自定義型別可以定義copy建構函式和賦值操作符。還可以定義move建構函式和賦值操作符。以普通函式為例,

void f(string&& s){}

void f(string& s){}

以上的函式過載解析再配合表示式的左右值屬性,就可以決定給f傳遞任意string時到底呼叫哪個f。

而move會返回右值,所以會強制呼叫f的右值引用版本。

6樓:quabqi

其實就是硬強轉,可以這麼說,你主動呼叫了強轉,編譯器就認為你知道自己在幹什麼,那麼就允許你這麼做。就像const_cast也可以擦除const一樣,不寫直接操作常量會報錯,主動const_cast了編譯器就認為你就是要改常量的值,即使真的用的是不可以改的常量編譯也不會報錯了。

常量字串是右值,為什麼沒有呼叫相應的右值過載函式?

冒泡 誰告訴你字串常量不是左值啦,明明就是左值。字串常量的型別是const char N N是長度 含末尾 0 陣列嘛,const左值 現行標準下,兩種寫法是等效的。但是VS2010發布於2010年,右值引用的語義在那之後又有發展。VS2010支援的右值引用語義對應的是v2.0 N2844 這個提案...

右值跟常量有什麼關係?

已登出 以下出自 The C Programing Language const左值引用和右值引用都可以繫結右值。但是,兩者的目的從根本上是不同的 我們用右值引用來實現 破壞性讀取 以優化某些本來只能依靠拷貝的情況。我們用const左值引用來阻止對引數的修改。string rr3 rr3引用乙個臨時...

為什麼不把要返回元素直接當成函式的返回值返回呢?

phoenix bool get elem elem get throw elem get bool 回字的四種寫法 iter get tuple get 想到再加 ant 有些時候乙個返回不夠用啊,函式中好幾個值需要傳出時只能通過引數傳遞實現,而不能簡單的通過函式返回值。當然,你也可以設計乙個資料...