2017-08-09 6 views
10

に応じて次のコードは結構です:CONST変数の値であるか、または定数式では使用できない、変数タイプ

constexpr double square_cstxpr(double x) { return x * x; } 

int main() { 
    const int test = 5; 
    constexpr double result = square_cstxpr((double)test); 
} 

しかし、testのタイプはconst doubleconst intから変更された場合、g ++は次のエラーを返します:the value of 'test' is not usable in a constant expression

グラムのコードと出力を参照してください++ここ:http://coliru.stacked-crooked.com/a/2fe9b176c2b23798

誰かがその動作を説明してもらえますか?

+0

記述しないでコンパイルしたコードを追加してください。 – molbdnilo

+1

@molbdnilo coliruへのリンクがあります。 – Zereges

+0

私にとってうまくいく! – Geek

答えて

5

constexprしかし、const変数は定数式で使用できるように、整数または列挙型でなければなりません。 [expr.const]/2を参照してください:

an lvalue-to-rvalue conversion unless it is applied to

(2.7.1) a non-volatile glvalue of integral or enumeration type that refers to a complete non-volatile const object with a preceding initialization, initialized with a constant expression, or [..]

この制限の理由は、ほとんど歴史的でなければなりません。浮動小数点数は、定数式については注意が必要です。非タイプのテンプレートパラメータと考える。これは、コンパイル時の計算が必要以上に数学的でないようにする、プラットフォーム依存の強い動作が原因です。 constant expression(コア定数式)から

+0

数年前、CWGは定数表現IIRCで 'const float'を使用できるようにするEWGの要求を拒否しました。 –

+0

@ T.C。 y CWGは誰もが大変な生活をしてくれるようにしました〜? – r0ng

7

10) Any other lvalue-to-rvalue implicit conversion, unless the lvalue...

a) has integral or enumeration type and refers to a complete non-volatile const object, which is initialized with a constant expression

それはここにいることを、意味:

const int test1 = 5; 
constexpr double result1 = square_cstxpr((double)test1); 

test1square_cstxprは、コンパイル時に引数としてtest1で呼び出すことができ、定数式でありますその結果をconstexpr変数resultに割り当てることができます。ここ一方、

:それは一体型または列挙型ではないので、

const double test2 = 5; 
constexpr double result2 = square_cstxpr((double)test2); 

test2は定数式ではありません。その結果、は、コンパイル時にtest2を引数として呼び出すことはできません。

関連する問題