たとえば、以下のコードincr()
は、宣言されていない限りコンパイルされませんconstexpr
。
int incr(int& n) {
return ++n;
}
constexpr int foo() {
int n = 0;
incr(n);
return n;
}
C ++ 14の§7.1.5/ 3を見ると、次のようになっています。
constexpr関数の定義は、次の制約を満たす必要があります。
(3.1)—仮想ではない(10.3)。
(3.2)—その戻り値の型はリテラル型でなければなりません。
(3.3)—そのパラメータタイプのそれぞれはリテラルタイプでなければなりません。
(3.4)—その関数本体は=削除、=デフォルト、またはを含まない複合ステートメントでなければなりません(3.4.1)— asm-definition、
(3.4.2)— gotoステートメント、
(3.4.3)— try-block、または
(3.4.4)—非リテラル型の変数の定義または静的またはスレッドの保存期間、または初期化が実行されない期間。
2段落後、[dcl.constexpr] / 5:
非テンプレート、非デフォルト
constexpr
関数、または非テンプレート、非デフォルト、非継承のconstexprコンストラクターの場合、関数またはコンストラクターの呼び出しがコア定数式の評価された部分式になるような引数値が存在しない場合(5.20)、またはコンストラクターの場合は、あるオブジェクト(3.6.2)の定数初期化子の場合、プログラムの形式が正しくありません。診断は必要ありません。
のfoo()
ためにコア定数式になる可能性のある引数が存在しないincr()
ため、プログラムの形式が正しくありません(NDR)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加