#include <exception>
constexpr bool foo(bool x)
{
return x ? true : throw std::exception();
}
int main()
{
// 1) must never be compiled
// static_assert(foo(false), "");
// 2) must always be compiled?
const bool x = foo(false);
// 3) must never compile?
constexpr bool y = foo(false);
return 0;
}
(1) はコンパイル エラーにつながるに違いないと確信しています。(2) は実行時に失敗しますが、コンパイル時に拒否されてはならないことは確かです。
興味深いケースは constexpr 変数 (3) です。この単純な例では、gcc と clang は実際に式を評価するため、プログラムを拒否します。(エラー メッセージ: y は定数式ではありません)。
すべての C++11 コンパイラーはプログラムを拒否することを余儀なくされていますか? foo(false) をより複雑な式に置き換えたらどうなるでしょうか?
constexpr がチューリング完全ではないことを知って驚きましたが、これは仕様の変更後になります 。constexpr ベースの計算はチューリング完全ですか?
多分これは私の質問に関連しています。私の知る限り、コンパイラは、この例の constexpr (3) の実際の評価を実行時まで延期することが許可されています。しかし、constexpr がチューリング完全である場合、コンパイラがすべての constexpr に対して例外をスローするかどうか (つまり、constexpr が無効であることを意味します) を決定できるとは信じがたいと思います。