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
所以你可以通過簡單地通過值來獲得相同的效果(儘管有更多的移動構造函數調用)。調用者使用'std :: move',構造函數使用'std :: move'。 2個構造函數,但沒有分配。 –
@波佩爾鬆:謝謝你的明確答案。我沒有想過多次引用Rvalue參數引起的問題。 @ Nicol Bolas:我不確定我是否理解你的觀點,你能舉一些例子嗎?謝謝。 – pmjobin