2017-02-24 5 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? 
} 

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」がx値であると感じているようです。 – Xirema

答えて

9

はい。 E1.E2所与C++ 14標準、§5.2.5/ 4.2:

E2は、非静的データメンバでありE1の種類は「CQ1のX VQ1」、及びE2のタイプである場合"cq2 vq2 T"の場合、式は最初の式で指定されたオブジェクトの名前付きメンバを指定します。 E1が左辺値の場合、E1.E2は左辺値です。 その他の場合E1.E2はx値です。

Pedantically、もともとC++ 11はこれを値として分類しましたが、そのような分類は無意味なので変更されました。変更が欠陥レポートによって適用された場合、それは遡及的です - 公開されたC++ 11標準ドキュメントN3290は間違っており、C++ 14ドキュメントはC++ 11を代わりに定義しています。そうでなければ、コンパイラが-std=c++11-std=c++14の間の微妙な動作の違いを実装する必要があるからです。今DRを検索するのは怠惰です。

+3

2013年に変更されました。CWG616を解決するにはhttps://github.com/cplusplus/draft/commit/728faf012696b81f906af77a1b22a8996dd7fa22をご覧ください:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html #616 – TBBle

関連する問題