2012-12-22 6 views
18
struct Bar 
{ 
    Bar() {} 
}; 


struct Foo 
{ 
    Foo() = default; 
    Bar m_bar; 
}; 

int main() 
{ 
    Foo foo; 
} 

सी ++ 11 default कीवर्ड और जीसीसी चेतावनी -Weffc++, का उपयोग करते समय जीसीसी आउटपुट:मैं जीसीसी चेतावनी को अनदेखा कर सकते हैं: 'फू :: m_bar' सदस्य प्रारंभ सूची में प्रारंभ किया जाना चाहिए [-WeffC++]

चेतावनी: 'फू :: m_bar' सदस्य प्रारंभ सूची में प्रारंभ किया जाना चाहिए [-WeffC++]

इसे सुरक्षित इस चेतावनी को अनदेखा करने के लिए है? क्या मुझे gcc पर एक बग फाइल करना चाहिए?

+2

"क्या मुझे gcc पर एक बग फाइल करना चाहिए" - नहीं। जब आपको लगता है कि यह एक कंपाइलर बग है, तो यह नहीं है। –

+2

अगर मैं 'bar() = default' करता हूं तो मुझे चेतावनियां नहीं दिखाई देती हैं। – Pubby

+5

करुणा में कोई डाउनवॉटिंग टिप्पणियां नहीं हैं ... – StoryTeller

उत्तर

27

आप चेतावनी को अनदेखा या दबा सकते हैं। यह एक प्रभावी सी ++ दिशानिर्देशों में से एक की गलत व्याख्या है। दिशानिर्देश असाइनमेंट के प्रारंभिकरण को प्राथमिकता देते हैं, लेकिन आपके उदाहरण में, m_bar प्रारंभ किया जाएगा। आपका कोड सही है।

स्रोत: जीसीसी के बग ट्रैकर में Jonathan Wakely:

# मद 12: कंस्ट्रक्टर्स में काम करने के लिए प्रारंभ पसंद करते हैं।

आइटम 4 द्वारा बदल दिया: "सुनिश्चित करें कि वस्तुओं प्रारंभ कर रहे हैं इससे पहले कि वे इस्तेमाल किया कर रहे हैं", और जी ++ मूल आइटम वैसे भी misinterprets और एक मेम-प्रारंभकर्ता, जो बहुत कष्टप्रद है बिना के बारे में कोई सदस्य चेतावनी देते हैं: कोई std :: स्ट्रिंग प्रारंभ करने के लिए कोई बिंदु नहीं है, इसमें एक पूरी तरह से सुरक्षित डिफ़ॉल्ट कन्स्ट्रक्टर है। मेरा - पीआर 2 9 72 के लिए वर्मिनिट पैच को इस आइटम, के लिए वर्तमान चेतावनी को प्रतिस्थापित करना चाहिए क्योंकि यह केवल कन्स्ट्रक्टर द्वारा अनियंत्रित सदस्यों के बारे में चेतावनी देता है।

(और के रूप में यह एक ज्ञात मुद्दा है, वहाँ एक बग के रूप में रिपोर्ट करने की कोई जरूरत फिर से है।)

+2

झूठी सकारात्मक से कुछ भी बदतर नहीं ... –

5

यह इस चेतावनी को अनदेखा करने के लिए ठीक है? हाँ।

क्या यह चेतावनी को अनदेखा करना एक अच्छा विचार है? निर्भर करता है (*)

क्या आपको gcc पर एक बग दर्ज करना चाहिए?कोई (*)

(*) वास्तव में

  • default निर्माता initialises m_bar ठीक, तो आप उस
  • परीक्षण कर सकते हैं यह थोड़ा अजीब लगता है कि जी ++ नहीं मिलता है कि
  • तुम बहुत चयनित वर्बोज़ चेतावनी सेटिंग
  • चेतावनी आपके कोड की शुद्धता के बारे में नहीं है, बल्कि शैली
  • पर आप इसे सही नहीं कर सकते हैं और फू और कस्टम कन्स्ट्रो के लिए डिफ़ॉल्ट कन्स्ट्रक्टर रख सकते हैं

    • मद 11:: बार

    man g++, अनुभाग के लिए आर -WeffC++

    स्कॉट Meyers 'प्रभावी सी ++ किताब से निम्नलिखित शैली दिशानिर्देशों के उल्लंघन के बारे में चेतावनी एक प्रति निर्माता परिभाषित करें और गतिशील आवंटित स्मृति वाले वर्गों के लिए एक असाइनमेंट ऑपरेटर।

  • आइटम 12: रचनाकारों में असाइनमेंट के लिए प्रारंभिकता को प्राथमिकता दें।
  • आइटम 14: आधार वर्गों में विनाशक आभासी बनाओ।
  • आइटम 15: "ऑपरेटर =" * के लिए एक संदर्भ वापस करें।
  • आइटम 23: किसी ऑब्जेक्ट को वापस करने पर संदर्भ वापस करने का प्रयास न करें।

इसके अलावा स्कॉट Meyers 'अधिक प्रभावी सी ++ किताब से निम्नलिखित शैली दिशानिर्देशों के उल्लंघन के बारे में चेतावनी:

  • आइटम 6: वेतन वृद्धि और घटती ऑपरेटरों के उपसर्ग और पोस्टफ़िक्स प्रपत्रों के बीच अंतर।
  • आइटम 7: कभी भी अधिभारित नहीं करें "& &", "││", या ","।

इस विकल्प का चयन करते समय, ध्यान रखें कि मानक लाइब्रेरी हेडर इन सभी दिशानिर्देशों का पालन नहीं करते हैं।

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