2011-07-01 15 views
18

मैं वर्तमान में सी ++ 0x की नई वर्दी प्रारंभिक समझने की कोशिश कर रहा हूं। दुर्भाग्य से, मैं संदर्भों के समान प्रारंभिक उपयोग का उपयोग कर stumpled। उदाहरण:संदर्भों का समान प्रारंभ

int main() { 
    int a; 
    int &ref{a}; 
} 

यह उदाहरण ठीक काम करता है:

% LANG=C g++ uniform_init_of_ref.cpp -std=c++0x -o uni -Wall -Wextra 
uniform_init_of_ref.cpp: In function `int main()': 
uniform_init_of_ref.cpp:3:10: warning: unused variable `ref' [-Wunused-variable] 

(अद्यतन Comeau कि उदाहरण के लिए एक त्रुटि फेंकता है, तो हो सकता है जीसीसी यह संकलन नहीं करना चाहिए और साथ ही)

अब, अगर मैं एक पूर्णांक के बजाय एक कस्टम डेटा प्रकार का उपयोग करता हूं, तो यह अब काम नहीं करता है:

class Y 
{}; 

int main() 
{ 
    Y y; 
    Y &ref{y}; 
} 

% LANG=C g++ initialization.cpp -std=c++0x -o initialization -Wall -Wextra 
initialization.cpp: In function `int main()': 
initialization.cpp:9:13: error: invalid initialization of non-const reference of type `Y&' from an rvalue of type `<brace-enclosed initializer list>' 
initialization.cpp:9:8: warning: unused variable `ref' [-Wunused-variable] 

दुर्भाग्य से, मुझे मानक मसौदे में प्रासंगिक अनुभाग नहीं मिला।

ComeauTest.c(9): error: reference variable "ref" requires an initializer 
     Y &ref{y}; 

तो, आप की कोई मुझे सही दिशा में बात कर सकते हैं: के रूप में Comeau इस संदेश के साथ शिकायत मेरा अनुमान है, कि मैं वर्दी आरंभीकरण के उपयोग गलत समझ रहा हूँ?


मामले में है कि आप को पता है क्यों यह सवाल प्रासंगिक है और यही कारण है कि मैं सिर्फ Y &ref(y) का उपयोग नहीं करना चाहते हैं: मैं एक निर्माता के प्रारंभ सूची में एक समान आरंभीकरण उपयोग करने में सक्षम होना चाहते हैं:

class X { }; 

class Y { 
    const X& x; 

    public: 
     Y (const X& xx): 
      x{xx} 
     {} 
}; 

int main() { 
    X x; 
    Y y{x}; 
} 

यह उपर्युक्त त्रुटि संदेश के साथ विफल रहता है।

नोट:

  • मैं LANG=C उपयोग कर रहा हूँ अंग्रेज़ी त्रुटि संदेश सक्षम करने के लिए।
  • जीसीसी संस्करण: 4.6.1
+0

जीसीसी 4.4.1 पहला उदाहरण संकलन नहीं करता है या तो: 'uniform_init_of_ref.cpp: 3: त्रुटि: आईएसओ सी ++ मनाही प्रारंभकर्ता सूची के उपयोग के जनमत संग्रह के प्रारंभ करने में ce ' – rmflow

+2

@rmflow ref'': gcc4.4 पूरी तरह से नहीं है समान प्रारंभिक कार्यान्वयन। –

+0

आप अपने कन्स्ट्रक्टर प्रारंभकर्ता सूची में सामान्य 'x (xx)' का उपयोग कर सकते हैं, जहां तक ​​मुझे उस नई भाषा वाली वर्दी सामग्री की आवश्यकता नहीं दिखाई दे सकती :-) –

उत्तर

6

N2672 के अनुसार पैरा 8.5.4.4 कहना चाहिए:

Otherwise, if T is a reference type, an rvalue temporary of the type referenced by T is list-initialized, and the reference is bound to that temporary. [ Note: As usual, the binding will fail and the program is ill-formed if the reference type is an lvalue reference to a non-const type. ]

जो (अगर मैं इसे सही ढंग से समझ) संदर्भ की वर्दी आरंभीकरण का मतलब है उन्हें नए को बांधता अज्ञात उदाहरण, तो ऐसा लगता है कि यह बहुत बेकार है। यह अभी भी व्याख्या नहीं करता है कि क्यों कोई काम करता है और दूसरा नहीं करता; उन्हें वही व्यवहार करना चाहिए (जब तक Y में कुछ स्पष्ट रचनाकार नहीं हैं)।

+0

तो पहले उदाहरण में, 'ref = 42' कर ** ** ** ''' को संशोधित नहीं करेगा। –

+0

@ एलेक्सेंड्रे-सी पहले उदाहरण में 'रेफरी' को असाइन करने के लिए यहां 'ए' के मान को बदलता है। – evnu

+0

@evnu: यह व्यवहार @Jan उद्धरण के अनुरूप नहीं है। क्या आपने Comau के साथ जांच की? –

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