2017-07-28 5 views
1

constexpr-ifステートメント内の関数パラメータを比較しようとしています。constexprのconstexpr関数パラメータの比較 - 条件によってエラーが発生する場合

は、ここで簡単な例です:

constexpr bool test_int(const int i) { 
    if constexpr(i == 5) { return true; } 
else { return false; } 
} 

しかし、私はこれは、次のフラグでGCC 7でコンパイルするとき: g++-7 -std=c++1z test.cpp -o test I次のエラーメッセージが出ます:

test.cpp: In function 'constexpr bool test_int(int)': 
test.cpp:3:21: error: 'i' is not a constant expression 
if constexpr(i == 5) { return true; } 

をしかし、 test_intを別の機能で置き換えた場合:

constexpr bool test_int_no_if(const int i) { return (i == 5); } 

その後、次のコードは、エラーなしでコンパイルします。

int main() { 
    constexpr int i = 5; 
    static_assert(test_int_no_if(i)); 
    return 0; 
} 

constexprの-かのバージョンがstatic_assertだけで正常に動作し、特に以来、コンパイルに失敗した理由を私は理解していません。

これに関するアドバイスをいただければ幸いです。

ありがとうございます! constexpr ifから

+2

なぜconstexpr(i == 5)で、i == 5ではないのですか? – deW1

+0

なぜそんなに複雑ですか?なぜ私は= 5を返さないのですか? – deW1

答えて

5

constexprのではif文、条件の値が が文脈bool型の定数式を変換しなければなりません。

constant expressionから次に

、:

は、コンパイル時に評価できる式を定義します。明らかに

iは、実行時に評価された関数のパラメータであるので、i == 5は、定数式ではありません。そのため、コンパイラが不平を言うのです。

あなたは機能を使用する場合:

constexpr bool test_int_no_if(const int i) { return (i == 5); } 

が、それはそれは、パラメータがコンパイル時に知られているかされていないのかどうかに応じて、コンパイル時間中に評価されるかもしれないが。

iが同じように定義されている場合:

constexpr int i = 5; 

その後、iの値は、コンパイル時に知られており、test_int_no_ifstatic_assert内で呼び出すことが可能となるコンパイル時に評価される可能性があります。

また、マーキング関数のパラメータはconstであるため、コンパイル時定数にはなりません。これは、関数内のパラメータを変更できないことを意味します。

1

constexpr関数は、非constexpr引数で呼び出すことができます。この場合、通常の関数のように動作します。したがって、constexprでないかのようにコードをコンパイルする必要があります。

つまり、test_int_no_ifには、私がconstexprであることに依存するものはありませんが、test_int()ではあります。 ( "constexpr if"はコンパイル時の式でのみ動作します)

関連する問題