2016-09-09 14 views
5

GCC không thể đánh giá một số biểu thức là hằng số. Clang tuy nhiên là tốt đẹp với nó.Constexpr: So sánh với nullptr - Lỗi hoặc tính năng?

/* 
*/ 
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"); 

cũng không làm việc:

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

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

Cùng một điều:

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

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

Live Example

Ý tôi là, so sánh với nullptr nên cái gì khác hơn một so với một địa chỉ ngẫu nhiên khác.

Bạn có thể nói: đó là lỗi hoặc vấn đề giải thích? Đối với tôi, rất khó để viết cùng một mã cho cả hai trình biên dịch ...

Lỗi này xảy ra đối với GCC 5.0 đến 5.4. Trong GCC 6+ chỉ foobar() không biên dịch.

Trả lời

Các vấn đề liên quan