2015-09-17 13 views
6
#include <iostream> 

union gc_bits { 
    size_t value; 
    struct { 
     size_t arena : 2; 
    } bits; 

    constexpr gc_bits(size_t value_) : value(value_) { 
    } 
}; 

static constexpr size_t get_max_arenas() { 
    return gc_bits(~0ULL).bits.arena; 
} 

size_t current_colour[get_max_arenas()]; // error 

int main() { 
    std::cout << get_max_arenas() << std::endl; 
} 

सरणी घोषणा त्रुटियां बाहर निकलें क्योंकि get_max_arenas एक constexpr नहीं है। मैं इस बारे में स्पष्ट नहीं हूं कि ऐसा क्यों होना चाहिए।यह एक कॉन्स्टेक्सर क्यों नहीं है?

+2

वैसे, आप 'मान' को लिखने और फिर' संघ में bits' से पढ़ें। क्या सी ++ में अनिर्धारित व्यवहार नहीं है? – gurka

+0

मुझे नहीं पता, आपको यूनियनों में सामान्य उपसर्गों से पढ़ने की अनुमति है, और चूंकि मूल्य और बिट दोनों आकार_टी से शुरू होते हैं, मुझे लगता है कि इसे अनुमति दी जानी चाहिए। – DrPizza

+0

वैसे 2: मानक यह नहीं कहता कि क्या दो बिट्स आकार_टी के बाएं या दाएं छोर से हैं। सीमा पोर्टेबिलिटी। मैं एक शिफ्ट और मुखौटा के साथ कोशिश करेंगे। –

उत्तर

7

थोड़ा अपने कार्यक्रम अलग ढंग से व्यक्त:

static constexpr auto gma = get_max_arenas(); 

size_t current_colour[gma]; // error 

बजना त्रुटि देता है:

read of member 'bits' of union with active member 'value' is not allowed in a constant expression

कारण आपको यह त्रुटि निर्माता सेट कि value, और फिर आप bits पढ़ने की कोशिश है मिलता है। @gurka द्वारा टिप्पणी के रूप में, इसकी अनुमति नहीं है।

Standard बोली:

[expr.const]

2 A conditional-expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (1.9), would evaluate one of the following expressions:

(2.8) — an lvalue-to-rvalue conversion (4.1) or modification (5.18, 5.2.6, 5.3.2) that is applied to a glvalue that refers to a non-active member of a union or a subobject thereof;

+1

ओह, तो बस एक मनमानी और व्यर्थ प्रतिबंध। धन्यवाद। – DrPizza

+0

@DrPizza नहीं, यह मनमाने ढंग से नहीं है: रनटाइम पर, यह एक गैर-सक्रिय संघ सदस्य तक पहुंचने के लिए [अपरिपक्व व्यवहार] (http://stackoverflow.com/q/11373203/819272) है, बिना किसी डायग्नोस्टिक के, जबकि संकलन-समय पर , आपको एक कंपाइलर त्रुटि की अतिरिक्त सेवा मिलती है। – TemplateRex

+0

यदि आपको लगता है कि यह मनमाने ढंग से नहीं है तो कृपया तर्कसंगत रचनाकारों के साथ प्रकारों को दंडित करने की अनुमति न देने के लिए तर्क को समझाएं, और अपने उत्तर में कृपया इस बारे में एक स्पष्टीकरण शामिल करना सुनिश्चित करें कि सी 11 इस बात की अनुमति देने में गलत क्यों है। – DrPizza

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