2015-10-23 10 views
6

साथ सी ++ 14सी ++ प्रारंभकर्ता सूची और मूलभूत मूल्यों

using namespace std; 
struct Point 
{ 
    int x = 0; 
    int y = 0; 
}; 
Point p2 {1, 1}; 

यह बजना ++ 7.0 के साथ ठीक संकलित है, यह दोनों ही मामलों में मैं पारित --std = c जी ++ 4.9 के साथ काम नहीं करता है इस कोड को मान्य है कंपाइलर के लिए ++ 1y।

जी ++ में यह तब काम करता है जब मैं संरचना परिभाषा से डिफ़ॉल्ट मान हटा देता हूं।

g++ test_constexpr_ctor.cc --std=c++1y -o test 
test_constexpr_ctor.cc:7:15: error: no matching function for call to ‘Point::Point(<brace-enclosed initializer list>)’ 
Point p2 {1, 1}; 
      ^
test_constexpr_ctor.cc:7:15: note: candidates are: 
test_constexpr_ctor.cc:1:8: note: constexpr Point::Point() 
struct Point 
     ^
test_constexpr_ctor.cc:1:8: note: candidate expects 0 arguments, 2 provided 
test_constexpr_ctor.cc:1:8: note: constexpr Point::Point(const Point&) 
test_constexpr_ctor.cc:1:8: note: candidate expects 1 argument, 2 provided 
test_constexpr_ctor.cc:1:8: note: constexpr Point::Point(Point&&) 
test_constexpr_ctor.cc:1:8: note: candidate expects 1 argument, 2 provided 
+0

शायद एक जीसीसी 4.9 बग। – 101010

+3

यह पुराने जी ++ की एक बग है। इसे एक नए संस्करण में अपडेट करें और यह सफलतापूर्वक संकलित करता है। –

+0

@VictorPolevoy क्या आपने G ++ संस्करण का परीक्षण किया था? –

उत्तर

3

कोड मान्य है। तो टी एक समग्र है - :

  1. (8.5.4/3):

एक वस्तु या प्रकार टी के संदर्भ की सूची-प्रारंभ इस प्रकार परिभाषित किया गया है , कुल प्रारंभिकता

  1. एक aggr C++ 14 eGate के रूप में (8.5.1/1) परिभाषित किया गया है:

एक कुल किसी सरणी या एक वर्ग (क्लॉज) कोई उपयोगकर्ता द्वारा प्रदान की कंस्ट्रक्टर्स साथ ( 12.1 है ), कोई निजी या संरक्षित गैर स्थिर डेटा सदस्यों (क्लॉज), कोई आधार वर्ग (क्लॉज), और कोई आभासी कार्य ( 10.3 )।

ध्यान दें कि C++ 11 इस परिभाषा देखा अलग (जोर मेरा):

एक कुल किसी सरणी या एक वर्ग कोई उपयोगकर्ता द्वारा प्रदान की कंस्ट्रक्टर्स साथ (क्लॉज) है ( 12.1 ), कोई ब्रेस या equal- प्रारंभकर्ता गैर स्थिर डेटा सदस्यों के लिए रों ( 9,2 ), कोई निजी या संरक्षित गैर स्थिर डेटा सदस्यों (क्लॉज), कोई आधार वर्ग (क्लॉज), और कोई आभासी कार्य ( 10.3 )।

चूंकि इस भाग को सी ++ 14 में हटा दिया गया है, इसलिए आपकी संरचना निश्चित रूप से एक समग्र है और इस प्रकार कुल प्रारंभिकता की जानी चाहिए।

यह gcc5 में fixed है ("गैर स्थैतिक डेटा सदस्य प्रारंभकर्ताओं के साथ समेकित" के लिए परिवर्तन सूची खोजें)। हालांकि मैं इसे "बग" नहीं कहूंगा, बल्कि जीसीसी टीम ने जीसीसी 5.1.0 में बदलाव को लागू किया है।

3

आपके द्वारा पोस्ट किया गया कोड बिल्कुल सही है।

हालांकि व्यवहार आपके पास जी ++ संस्करण 4.9.1 के not yet closed bug है। वास्तव में, यह एक नकली हो सकता है और कुछ अन्य बग रिपोर्ट में बंद कर दिया क्योंकि समस्या g++5.1.0 या शायद पुराने संस्करण के बाद से तय हो गई है हो सकता है। वास्तविक बग खोजने के लिए आप bugzilla's search का उपयोग कर सकते हैं।

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