int d = 1;
constexpr void add()
{
d++;
}
int main()
{
}
GCC 7.1は以下のエラーを報告します。エラーメッセージは非常に明確です。問題は、私がconstexprに明示的に説明していることが違法であるとは言いません。constexpr非メンバ関数のグローバル非定数変数にアクセスするのがなぜ合法でないのですか
誰かがこのルールで定義されているルールが違反していると説明できますか?
main.cpp: In function 'constexpr void add()': main.cpp:8:1: error: the value of 'd' is not usable in a constant expression } ^ main.cpp:4:5: note: 'int d' is not const int d = 1; ^
「このような関数の呼び出しその引数の値の少なくとも1つのセットが存在しますコア定数式 " –
の評価された部分式かもしれません。オブジェクトが不揮発性のリテラルタイプを持ち、その寿命が式の評価内で始まらない限り、オブジェクトの変更はルール#16を破るようです。しかし、私がconstexpr void add()に変更した場合 { d = 2; }それは通過できます。 – Kane
clangのエラーメッセージが明白に見えますが、定数式ではその式の外側に表示されているオブジェクトを変更できません。しかし、私はまだそれが壊れているルールを見つけることができませんhttp://en.cppreference.com/w/cpp/language/constant_expression#Core_constant_expressions – Kane