2016-07-30 7 views
0

Visual Studio 2015アップデート3単純なconstexpr関数のパラメータを増やせないのはなぜですか?

私はプログラミングを読んでいます。 C++を使用した原則と実践(第2版)Bjarne Stroustrup (代わりに、最初の変異体)

constexpr int get_value(int n) { 
    return n + 1; 
} 

しかし、私はこれをコンパイルすることはできません:私はconstexpr機能を学ぶ...

それは動作します

constexpr int get_value(int n) { 
    return ++n; 
} 

私はエラーを取得する:

constexpr function return is non-constant

nは、ローカルget_value関数の変数です。私。 n変数の変更は外部コードに影響しません。

なぜget_value関数の2番目の変種が間違っていますか?

+2

適切なコンパイラを試してください。 – Columbo

+0

私は 'codeblock'を' g ++ 5.3.1'で試して暴走しました。 –

+0

@ k-five、Hm ...多分私の問題は私が使っているIDEに特有です... –

答えて

3

2番目はC++で許可されていません11 constexpr

constexpr int prev(int x) 
{ return --x; } // error: use of decrement 

N3337 [expr.const]/2が明示的に禁止 "増減操作" 定数式中:標準も非常に類似した例を(N3337 [dcl.constexpr]/3)でした。

C++ 14拡張constexprはこれらの要件を緩和しますが、MSVCはそれを実装していません。

+0

ええと...なぜそれが禁止されたのですか?それにはどんな危険がありますか? –

+0

@AndreyBushman:危険はなく、純粋な仕様です:_no mutationは許可されました。この制限は、C++ 14では消えます。なぜなら、インクリメントとデクリメントの操作がもはや選択されていないだけでなく、一般に突然変異が許されるからです。 – ildjarn

2

2番目はC++ 14では有効ですが、Visual Studio 2015はconstexpr機能の部分的なサポートしかないためコンパイルできません。これは、単一戻り関数constexprの機能と(あなたのような)他の制限をサポートしています。これはC++ 11で有効です。

thisの記事(constexpr段落内)を参照してください。 Visual Studio "15"は、constexprの機能を改善します。あなたはちょっと待たなければなりません:)

関連する問題