2013-02-01 48 views
1

我有一個代碼,必須處理rvalued stl容器。 我的問題是:爲什麼從rvalued-STL容器返回一個元素,就像在成員函數:爲什麼來自rvalued-stl-container的元素獲取器返回左值?

vector<int>{1}.front() 

回報左值和右值不? Standard指定rvalue對象的成員是右值。我知道我可以用std::move顯式移動返回的元素。但是,當返回值顯示右值時,具有左值返回類型的邏輯是什麼?

如果你會用這樣的表達一些valuness,重載函數的參數,錯超載將被選中,調用的函數會得到一個左值引用(不久將成爲懸掛)。

+2

簡單,因爲沒有右值重載的memberfunctions,如'T &&前面()&& {返回移動(前()); }' – Xeo

+0

因此,比這是STD缺陷等待rvalue-for-this功能被執行? –

+0

我不知道,如果這真的算作是標準的缺陷,但你可以嘗試藏漢在http://isocpp.org郵件列表的報告。 – Xeo

回答

1

對於入站rvalues,出口右值可能增加outplace_front()outplace_back()將是emplace_front()emplace_back()精神中更好的名稱。

+1

咦? 'front()&&''會'移動'元素,它不會刪除它。 – ecatmur

+0

@ecatmur和矢量元素數量必須減少,對吧? – TemplateRex

+1

@rhalbersma:不是嗎? – Puppy

1

一旦編譯器決定調用一個特定的成員函數(例如int &std::vector<int>::front()),類型系統只知道int &被返回,所以它必須將它視爲一個左值,即使它的生存期限制爲業主暫時。

在C++ 11之前,根據被調用的對象的值類別(參見What is "rvalue reference for *this"?),成員函數不可能被重載,僅限於對象的cv限定;和一個非const臨時顯然不是const所以非const重載必須是可用的。

,以及你已經確定了潛在的晃來晃去左值的引用,這導致在C++ 03到operator<<上的臨時ostream可以與char(成員函數operator)被調用的情況,但不與string(免費運營商); C++ 11針對右值引用和成員函數的右值*this重載解決了這個問題。

右值*this允許三個重載front

T &front() & { return data_[0]; } 
const T &front() const & { return data_[0]; } 
T &&front() && { return std::move(data_[0]); } 

的不同的功能體的右值過載是有點疣;這是因爲ref-qualifier對成員函數體內的*this訪問成員沒有影響。

+0

該建議已被接受,並且是C++ 11的一部分。鏗鏘現在支持它,大多數其他編譯器不支持。 – Puppy

+0

@DeadMG哎呀,謝謝。 – ecatmur

相關問題