2017-02-24 21 views
13
#include <vector> 

using namespace std; 

struct A 
{ 
    vector<int> coll; 
}; 

void f(const vector<int>&){} 
void f(vector<int>&&){} 

int main() 
{ 
    f(A().coll); // Is "A().coll" an xvalue? 
} 

C++ 11保證f(A().coll)會叫void f(vector<int>&&)C++ 11中的臨時對象是一個xvalue的數據成員嗎?

+0

高度相關:http://stackoverflow.com/questions/35947296/about-binding-a-const-reference-to-a-sub-object-of-a-temporary – NathanOliver

+0

[GCC編譯的Ideone.com] (http://ideone.com/z9lpCD)似乎覺得'coll'是一個xvalue。 – Xirema

回答

9

是的。 C++ 14標準,§5.2.5/ 4.2,給出E1.E2

如果E2是非靜態數據成員和E1類型是「CQ1 VQ1 X」,和E2類型是「cq2 vq2 T」,表達式指定由第一個表達式指定的對象的已命名成員。如果E1是左值,則E1.E2是左值; 否則E1.E2是一個xvalue。

緩緩地,原本C++ 11把這個分類爲prvalue,但是這樣的分類沒有意義,所以它被改變了。但是,如果更改是由缺陷報告應用的,那麼它是追溯性的 - 發佈的C++ 11標準文檔N3290是錯誤的,而C++ 14文檔定義了C++ 11。情況可能是這樣,否則將需要編譯器在-std=c++11-std=c++14之間的行爲中實現細微的差異。我現在懶懶地搜索DR。

+3

它在2013年發生了變化,請參閱https://github.com/cplusplus/draft/commit/728faf012696b81f906af77a1b22a8996dd7fa22來解決CWG616:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html #616 – TBBle

相關問題