2012-03-20 30 views
9

私は次のようになりますconstexprの機能があります:定数式constexpr関数の引数がconstであることをstatic_assertに伝えるには?

に表示することはできません「バー」:GCC 4.6.3でこれをコンパイルすると、私に

エラーを言って続けて、しかし

constexpr int foo(int bar) 
{ 
    static_assert(bar>arbitrary_number, "Use a lower number please"); 

    return something_const; 
} 

私は

constexpr int foo(constexpr const int bar) 
{ 
    static_assert(bar>arbitrary_number, "Use a lower number please"); 

    return something_const; 
} 

のようなものを試してみましたが、constexprのは、関数の引数には使用できません。

バーは常にコンパイル時定数であることをコンパイラに伝える簡単な方法はありますか?

+0

その部分をコード化することを完全に忘れてしまいました。ありがとう@Henrik – TravisG

+7

constexpr関数は非const引数で呼び出すことができますが、単にconstexpr'nessを失います。 –

+1

ありがとう、私はそれを知らなかった。 – TravisG

答えて

16

Is there some simple way to tell the compiler that bar is always a compile time constant?

barは常にコンパイル時定数をある場合は、としてあなたの関数を記述する必要があります、あなたがそうすると、代わりにあなたはすでに書いたものを書いていないので、場合

template<int bar> 
constexpr int foo() 
{ 
    static_assert(bar>arbitrary_number, "Use a lower number please"); 
    return something_const; 
} 

その場合、関数は、非const引数でも呼ばれるとすることができます。非const引数を渡すと関数は失われます。constexpr -nessです。

上記のコードでは、arbitrary_numberも定数式でなければなりません。それ以外の場合はコンパイルされません。あなたはiが正確に上記の定数式ではない、まだそれはまだconstexpr機能を使用することができます見ることができるように

int i; 
std::cin >> i; 
foo("foo", i); 

0

fooは、次のように使用することができます。 constexprファンクション(およびファンクションテンプレート)は、それを保証する変な獣です。 foo(p, i)は、pおよびiもある場合、定数式です。でも、は通常の関数のように使用できます。

関数への引数が常に定数式であることを意味する場合は、関数引数ではなくテンプレート引数である必要があります。

5

constexpr機能コンパイル時に評価され、それは一般的に標準によって強制的にいないこと(あなたがそれでconstexpr変数を初期化するように定数式の内側にそれを使用することにより、コンパイル時に評価される機能を強制することができます) 。

また、constexpr関数の引数は実際には定数ではなく、(コンパイル時に評価されたとしても)呼び出しごとに変更される可能性があります。

残念ながら、非タイプテンプレートを使用して、常にコンパイル時定数(そうであると思われる)の場合は、barを渡します。

関連する問題