2015-03-27 9 views
6

मैं या यकीन है कि अगर यह एक संकलक बग है नहीं कर रहा हूँ अगर मैं constexpr गलत:एक अनियंत्रित constexpr चर स्थिर क्यों नहीं है?

struct S{}; 
constexpr S s1{}; 
constexpr S s2; 

struct test{ 
    static constexpr auto t1 = s1; 
    static constexpr auto t2 = s2; //error here 
}; 

जीसीसी 4.8 मुझे एक अजीब त्रुटि दे रहा है "त्रुटि: क्षेत्र प्रारंभकर्ता स्थिर नहीं है"। एस 2 वास्तव में स्थिर नहीं है? यदि ऐसा है तो क्यों?

स्पष्टता के लिए मैं वास्तव में अपने कोड में खाली structs का एक समूह (मेटा प्रोग्रामिंग https://github.com/porkybrain/Kvasir के लिए) का उपयोग कर रहा हूं, इसलिए मुझे वास्तव में इस विशिष्ट उदाहरण में रूचि है।

+0

क्लैंग के लिए, * कॉन्स्ट प्रकार 'कॉन्स्ट एस' के किसी ऑब्जेक्ट का डिफ़ॉल्ट प्रारंभ करने के लिए उपयोगकर्ता द्वारा प्रदान किए गए डिफ़ॉल्ट कन्स्ट्रक्टर * [डेमो] (http://coliru.stacked-crooked.com/a/858633b06d501e42) – Jarod42

उत्तर

4

अद्यतन: कोड, संकलन चाहिए क्योंकि [class.ctor]/5 पढ़ता है:

The implicitly-defined default constructor performs the set of initializations of the class that would be performed by a user-written default constructor for that class with no ctor-initializer (12.6.2) and an empty compound-statement. If that user-written default constructor would satisfy the requirements of a constexpr constructor (7.1.5), the implicitly-defined default constructor is constexpr .

और S के बाद से सिर्फ एक खाली struct है, परोक्ष परिभाषित डिफ़ॉल्ट निर्माता खाली है और इस तरह संतोषजनक constexpr आवश्यकताओं है।

तो यहां आप कंपाइलर्स की अपूर्णता से निपट रहे हैं, जिसे आपको किसी भी तरह से काम करना है।


पुराना जवाब:

बजना अधिक समझदार त्रुटि संदेश का उत्सर्जन करता है:

main.cpp:3:13: error: default initialization of an object of const type 'const S' 
requires a user-provided default constructor 
constexpr S s2; 
      ^

[dcl.constexpr]/9 विवरण उपलब्ध कराती है और यहां तक ​​कि लगभग ठीक एक उदाहरण के रूप में अपने कोड:

A constexpr specifier used in an object declaration declares the object as const. Such an object shall have literal type and shall be initialized.(...) [ Example:

struct pixel { 
    int x, y; 
}; 
constexpr pixel ur = { 1294, 1024 };// OK 
constexpr pixel origin; // error: initializer missing 

—end example ]

+0

शायद खाली संरचना के लिए जरूरी नहीं होना चाहिए, और मुझे लगता है कि इसके लिए मानक बदलने का प्रस्ताव था। मैं इसे अभी नहीं देख सकता (टिप्पणी एक फोन पर काफी कठिन है) लेकिन यदि आप इसे पा सकते हैं तो यह आपके उत्तर में शामिल हो सकता है। – hvd

+0

'constexpr' डिफॉल्ट कन्स्ट्रक्टर प्रदान करना' s2' की परिभाषा को प्रारंभकर्ता के बिना परिभाषित करता है, 'clang' के त्रुटि संदेश संकेत के रूप में। दिलचस्प बात यह है कि, जीसीसी ने 'constexpr एस() = डिफ़ॉल्ट स्वीकार किया है,', clang (3.6 के रूप में) नहीं है। मेरा मानना ​​है कि क्लैंग गलती में है, क्योंकि [dcl.constexpr]/4 इस घोषणा की अनुमति देता है, [dcl.constexpr]/9 केवल एक निरंतर अभिव्यक्ति की मांग करता है, और [expr.const] इस मामले को किसी अन्य 'कॉन्टेक्सप्र' कन्स्ट्रक्टर की तरह व्यवहार करता है, लेकिन व्यावहारिक रूप से इसका मतलब है कि पोर्टेबिलिटी के लिए 'constexpr एस() {}' आवश्यक है। – Wintermute

+0

@ विंटरम्यूट अब मुझे संदेह है क्योंकि '[class.ctor]/5' के अनुसार' एस' के लिए निहित डिफ़ॉल्ट सीटीआर 'constexpr' होना चाहिए, इसलिए कोड को संकलित करना चाहिए। –

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