2017-04-04 122 views
1

示例A中使用的移動語義是必需的,哪個結構優越?我應該總是在構造函數中使用std :: move嗎?

實例A:

struct A 
{ 
    std::string a; 
    A(std::string a) : a(std::move(a)){ } 
}; 

例B:

struct B 
{ 
    std::string b; 
    B(const std::string& b) : b(b){ } 
}; 

我不相信這是一個重複的問題。我正在問具體哪個示例從在類構造函數中使用成員初始化的角度來看更加優越。其他問題中列出的例子或答案都沒有涉及成員初始化。

我不喜歡用引用參數調用構造函數,然後複製到成員中。看起來有多個複製操作可能是浪費的。

我想「管」數據到成員儘可能有效,但我不想將rvalues作爲構造函數參數。

+3

如果該值是一個「int」或其他單值基元,則使用「move」或引用(const或其他)是毫無意義的。另外,在這種情況下,我會考慮沒有顯式構造函數的結構,在這裏使用聚合初始化工作得很好。 – ShadowRanger

+0

爲了簡化示例,我使用了'int'。如果它是'std :: string'或者其他更復雜的類,哪個更好? (編輯我的答案,並將'int'更改爲'std :: string') –

+0

[什麼是std :: move(),什麼時候應該使用?](http://stackoverflow.com/questions/3413470/what-is-stdmove-when-should-it-be-used) – chbchb55

回答

0

在我看來,它是不是真的比較兩者。

大多數時候的實現拷貝構造函數使得深拷貝和背後的主要意圖是確保源對象是修改。

std :: move最終調用rvalue引用的移動構造函數的std :: move只複製指針,並可以將源對象指針設置爲NULL。此場景主要用於臨時對象

所以這兩個例子都是爲了兩個不同的目的一個(拷貝構造函數),當你想源對象是不變,而其他(STD ::移動)是爲應對臨時對象。

+1

但是該參數是通過'std :: move'中的值傳遞的,所以'std :: string'的拷貝構造函數被用來創建一個臨時對象,然後它被移入成員變量中 - 所以到目前爲止如我所知,這兩種情況是相同的,而且選擇哪一種只是一種風格問題。 –

+0

是不是示例稍微好一點,因爲它不使用引用作爲中介來創建副本? –

+0

示例A是否也有複製構造函數imementation?即使如果沒有默認的拷貝構造函數在你傳值的時候被調用。所以在例子A中它不會像「一個完整的拷貝構造函數調用+ std :: move」? – Naidu

相關問題