2016-09-09 4 views
5

GCCは一部の式を定数として評価することができません。しかし、クラングはそれでいいです。Constexpr:nullptrとの比較 - バグまたは機能?

/* 
*/ 
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との比較はとの比較よりも何か他のものでなければなりません他のランダムアドレス。

あなたは言う:それはバグか解釈の問題ですか?私にとって、両方のコンパイラに同じコードを書くのは難しいです...

このエラーは、GCC 5.0〜5.4で発生します。 GCC 6+では、foobar()のみがコンパイルされません。

答えて

関連する問題