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

करता है सी ++ 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- समकालीन – NathanOliver

+0

[जीसीसी-संकलित Ideone.com] (http://ideone.com/z9lpCD) ऐसा लगता है कि 'coll' एक xvalue है। – Xirema

उत्तर

9

हां। सी ++ 14 मानक, §5.2.5/4.2, यह देखते हुए E1.E2:

तो E2 एक गैर स्थिर डेटा सदस्य और E1 के प्रकार है कि "CQ1 vq1 एक्स", और E2 के प्रकार "cq2 vq2 टी" है, अभिव्यक्ति पहली अभिव्यक्ति द्वारा निर्दिष्ट ऑब्जेक्ट के नामित सदस्य को निर्दिष्ट करती है। यदि E1 एक लवली है, तो E1.E2 एक लवली है; अन्यथा E1.E2 एक xvalue है।

pedantically, मूल रूप से सी ++ 11 एक prvalue के रूप में इस वर्गीकृत है, लेकिन इस तरह के वर्गीकरण व्यर्थ था तो यह बदल गया था। यदि परिवर्तन एक दोष रिपोर्ट द्वारा लागू किया गया था, हालांकि, यह पीछे हटाना है - प्रकाशित सी ++ 11 मानक दस्तावेज़ N3290 गलत है और C++ 14 दस्तावेज़ इसके बजाय C++ 11 को परिभाषित करता है। यह मामला होने की संभावना है, अन्यथा -std=c++11 और -std=c++14 के बीच व्यवहार में सूक्ष्म अंतर को लागू करने के लिए कंपाइलर्स की आवश्यकता होगी। मैं अभी डीआरएस के माध्यम से खोज करने के लिए आलसी हूँ।

+3

यह 2013 में बदला गया था, CWG616 को हल करने के लिए https://github.com/cplusplus/draft/commit/728faf012696b81f906af77a1b22a8996dd7fa22 देखें: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html # 616 – TBBle

संबंधित मुद्दे