2011-08-23 54 views
7

最近我一直在玩Rvalue引用,並且遇到了一個奇怪的問題。讓我們來定義名爲Foo一些簡單的類,它包含一個vector<int>初始化列表中的Rvalue引用用法

class Foo 
{ 
public: 

    Foo(std::vector<int>&& v) 
     : v_(v) 
    {} 

private: 

    std::vector<int> v_; 
}; 

一個Foo例如可以通過傳遞一個vector<int>暫時是這樣構成:

std::vector<int> temp; 
Foo(std::move(temp)); 

現在,當我上前一步,通過這個代碼,我注意到Foo中的矢量是使用copy-constructor而不是move-constructor來構造的。但是,如果我指定的構造函數,而不是這樣:

Foo(std::vector<int>&& v) 
    : v_(std::move(v)) 
{} 

然後,v_成員的舉動,構造適當調用。爲什麼?爲什麼初始化列表中需要多餘的std::move(v)?爲什麼編譯器無法推導出調用向量移動構造函數的意圖,因爲將相應的Foo構造函數參數指定爲Rvalue引用?

順便說一下,我使用GCC 4.6和-std = C++ 0x選項。

感謝您的幫助。 PMJ

回答

7

函數(或構造函數)內部的一個命名參數是一個左值,即使它被聲明爲右值引用。

的基本原理是一樣的東西

void foo(std::vector<int>&& v) 
{ 
    bar(v); 
    baz(v); 
    boo(v); 
    buz(v); 
} 

在這些電話應該編譯考慮對象v移動?

沒有一個,除非你明確地做。

+0

所以你可以通過簡單地通過值來獲得相同的效果(儘管有更多的移動構造函數調用)。調用者使用'std :: move',構造函數使用'std :: move'。 2個構造函數,但沒有分配。 –

+0

@波佩爾鬆:謝謝你的明確答案。我沒有想過多次引用Rvalue參數引起的問題。 @ Nicol Bolas:我不確定我是否理解你的觀點,你能舉一些例子嗎?謝謝。 – pmjobin