2015-01-07 28 views
1

是否標準::移動需要使用通用引用時必須用的std ::前鋒組合?例如,以下兩段代碼中的哪一段是正確的?當使用轉發引用時,std :: move是否需要與std :: forward結合使用?

void bar(auto && x) { 
    auto y(std::move(std::forward<decltype(x)>(x))); 
} 

void bar(auto && x) { 
    auto y(std::move(x)); 
} 

基本上,我想X的內存移動到y和我不在乎,如果它是一個左值引用或r值的參考。當然,我不想在這裏輸入const值。

+1

號只能使用其中的一種。 –

+2

它們都等價於'auto y(std :: move(x))',它**不**轉發,只是轉換爲右值引用。請記住,'的std ::向前()'是有條件的強制轉換爲rvalue-或左值引用(取決於價值範疇),而'的std ::移動()'是*無條件*強制轉換爲rvalue-參考。 – 0x499602D2

回答

2

A move就足夠了,如果你想移動無論的參數的值類別。
forward在這種情況下,多餘的,因爲move(forward(x))始終是一個右值,不管是什麼forward(x)是。

如果您只想根據bar的參數是否爲右值來移動,則應該使用forward,它會傳播值類別。 !

+0

現在,即使調用'forward'是多餘的,是不是原型'move'技術上的通用參考,其建議的前鋒? – wyer33

+0

@ wyer33試想一下'move'作爲一個函數返回一個右值並引用它的參數。想象一下'forward'是一個函數,它返回一個指向其參數的左值或右值引用。無論如何,'forward'在表達式中的區別(如果有的話)將被'move'消除。 – Columbo

0

/\當心/ \

使用std::move用於通用的參考可以是一個非常糟糕的主意,並強烈建議迴避:

auto name = getName(); // std::string getName(); 
bar(name); 
// 'name' value has been moved... And its value now is unknown, empty at best. 

move(forward(x))是不良作風和不應該使用。

您應該使用std::move爲右值引用和std::forward普遍引用。參看正式定義。

auto&&是一個普遍的基準,因此,你應該寫的是:

void bar(auto&& x) { 
    auto y(std::forward<decltype(x)>(x)); 
} 
+0

auto作爲函數參數?您使用的是哪一個C++版本,C++ 21? –

+1

@ViktorSehr C++ 14 – Six

+1

Six60r:它是一個*縮寫功能*這是不標準的一部分(還),@ViktorSehr FYI –

相關問題