2017-12-10 89 views
6

मैंने -Wall और -Wextra सक्षम के साथ जीसीसी के साथ कुछ कोड संकलित किया।क्या मुझे Wmissing-field-शुरुआतीकरण और C++ 17 में कुल प्रारंभिकता के बारे में चिंतित होना चाहिए?

struct A { A(int) {} }; 
struct B {}; 

struct C : A, B {}; 

int main() { 
    (void) C{1}; 
} 
main.cpp: In function 'int main()': 
main.cpp:11:15: warning: missing initializer for member 'C::<anonymous>' [-Wmissing-field-initializers] 
    (void) C{1}; 
      ^

मुझे लगता है कि के बारे में चिंतित होना चाहिए: इस कोड को एक चेतावनी के उत्पादन होता है? क्या यह चेतावनी को आउटपुट करने के लिए जीसीसी में एक बग है? ऐसा लगता है कि मेरे पास प्रारंभ करने के लिए कोई फ़ील्ड नहीं है, और कोई गुम पैरामीटर नहीं है।

उत्तर

7

सी ++ 17 आपको बेस क्लास के साथ कक्षाओं पर कुल प्रारंभ करने की अनुमति देता है। प्रत्येक बेस क्लास को प्रभावी रूप से सदस्य माना जाता है (वे कक्षा के प्रत्यक्ष सदस्यों के सामने आते हैं)। इसलिए कुल आरंभ करने के लिए, C में दो "सदस्य" हैं: C::A और C::B

आपने केवल एक प्रारंभ किया।

ओह सुनिश्चित करें, B में वास्तव में प्रारंभ करने के लिए कुछ भी नहीं है। लेकिन -Wall लिए, यह इस से अलग नहीं है:

struct C 
{ 
    A a; 
    B b; 
}; 

(void) C{1}; 

यह एक चेतावनी भी देना होगा। B: (void)C{1, {}}; के लिए एक स्पष्ट प्रारंभकर्ता प्रदान करके आप इसे किसी भी मामले में चुप कर देंगे।

लेकिन जहां तक ​​मानक का संबंध है, यह पूरी तरह से मान्य कोड है। B मूल्य प्रारंभ किया जाएगा। किसी भी स्थिति में।

+0

ओह ठीक है ... मैं वहां सामान्य कोड से निपट रहा हूं, इसलिए मुझे खाली पैरामीटर जोड़ना मुश्किल होगा :( –

+0

@GuillaumeRacicot क्या यह संभवतया आपको प्रारंभिक उम्मीदवारों की अपेक्षित संख्या जानने में मदद करेगा? इनका उपयोग किया जा सकता है SFINAE। –

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

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