2016-09-09 10 views
5

जीसीसी कुछ अभिव्यक्तियों को निरंतर मूल्यांकन करने में असमर्थ है। हालांकि क्लेंग इसके साथ अच्छा है।Constexpr: नलप्टर की तुलना - बग या सुविधा?

/* 
*/ 
constexpr int foo(const int * array) 
{ 
    if (array == nullptr) // Error: '(((const int*)(& array)) == 0u)' is not a constant expression 
    { 
    return 0; 
    } 

    return 1; 
} 

constexpr int bar() 
{ 
    int array[100] = {}; 

    return foo(array); 
} 

static_assert(bar() == 1, "outch..."); // Does not compile. See above. 
static_assert(foo(nullptr) == 0, "okay"); 

constexpr int i[100] = {}; 
static_assert(foo(i) == 1, "okay"); 

भी काम नहीं करता:

constexpr int foobar() 
{ 
    int array[100] = {}; 
    int *ar = array; 
    if (ar == nullptr) // Error... 
    { 
    return 0; 
    } 
    return 1; 
} 

static_assert(foobar() == 1, "okay"); 

यही बात:

constexpr int foo2() 
{ 
    int *a = nullptr; 
    if (a == nullptr) // Error... 
    { 
    return 0; 
    } 
    return 1; 
} 

static_assert(foo2() == 0, "okay"); 

Live Example

मेरा मतलब है, nullptr करने के लिए एक तुलना एक करने के लिए एक तुलना की तुलना में कुछ और ही होना चाहिए अन्य यादृच्छिक पता।

क्या आप कहेंगे: यह एक बग या व्याख्या का विषय है? मेरे लिए, दोनों कंपेलरों के लिए एक ही कोड लिखना मुश्किल है ...

यह त्रुटि जीसीसी 5.0 से 5.4 के लिए होती है। जीसीसी 6+ में केवल foobar() संकलित नहीं करता है।

उत्तर

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