Friday 15 June 2012

c++ - Why is an integer being promoted via an explicit constructor? -


<पूर्व> #include & lt; cstdint & gt; Constexpr uint32_t ticksPerSecond = 100000; स्ट्रक्चर टाइममेमेज़र {कॉन्स्टेक्सफ स्पष्ट टाइममेचर (यूआईटी 64_ सी सी): टीक्स (सी) {} यूआईटी 64_टी टीक्स; Constexpr timemeasure (): ticks (0) {}}; संरचना समय: समयरेखा {अब स्थिर वाष्पशील समय; Constexpr time (): टाइममाइज़र () () स्पष्ट समय (uint64_t c): टाइममाइज़र (सी) {} // `एक्स = समय :: समय के लिए आवश्यक स्पष्ट समय (कॉन्स्ट वाष्पशील समय & amp; टी): टाइमरमायर (टी। Ticks) {} समय & amp; ऑपरेटर = (अस्थिर समय टी) {ticks = t.ticks; वापसी * ​​यह; }}; इनलाइन समय foo (समय और समय) {वापसी समय (टीओटीई + 1); }

संकलन त्रुटि देता है:

  prog.cpp: फ़ंक्शन में "समय" foo (const time & amp;) ???? : Prog.cpp: 22: 57: त्रुटि: कॉल करने के लिए कोई मेल नहीं फ़ंक्शन: समय :: समय (समय) एक ???? Prog.cpp: 22: 57: नोट: उम्मीदवार है: prog.cpp: 14: 15: नोट: constexpr time :: time () prog.cpp: 14: 15: नोट: उम्मीदवार को 0 तर्क, 1 प्रदान की   

क्यों समय :: समय (समय) को बुलाया जा रहा है? निश्चित रूप से uint64_t को पदोन्नत करने की अनुमति नहीं है?

कॉपी निर्माता समय को स्पष्ट के रूप में चिह्नित किया गया है, और फ़ंक्शन से मान लौटाते समय, उस मूल्य से एक अस्थायी कॉपी-आरंभीकृत है सी ++ 11 मानक के परिच्छेद 8.5 / 15 मानक निर्दिष्ट करता है:

प्रपत्र में होता है प्रारंभ

  टी x = a;   

साथ ही साथ बहस में, फ़ंक्शन वापसी , एक अपवाद फेंकना (15.1), एक अपवाद (15.3), और कुल मिलाकर सदस्य प्रारंभ (8.5.1) ) को कॉपी-इनिशियलाइज़ेशन कहा जाता है [...]

हालांकि, स्पष्ट के रूप में चिह्नित कंसल्टेंटर्स को कॉपी-इनिशियलाइजेशन के संदर्भ में नहीं माना जाता है (देखें 13.3.1.4/1 और 13.3। 1.5 / 1), इसलिए त्रुटि।

No comments:

Post a Comment