ご存じのとおり、C++11 ではconstexprキーワードが導入されました。
C++11 ではキーワード constexpr が導入されました。これにより、ユーザーは関数またはオブジェクト コンストラクターがコンパイル時の定数であることを保証できます。[...]これにより、コンパイラは[関数名]がコンパイル時の定数であることを理解し、検証できます。
私の質問は、宣言できる関数の形式になぜそのような厳しい制限があるのかということです。関数が純粋であることを保証したいという欲求は理解していますが、次のことを考慮してください。
関数で constexpr を使用すると、その関数で実行できることがいくつか制限されます。まず、関数には void 以外の戻り値の型が必要です。次に、関数本体で変数を宣言したり、新しい型を定義したりできません。第 3 に、本文には、宣言、null ステートメント、および 1 つの return ステートメントのみを含めることができます。引数置換後に return ステートメントの式が定数式を生成するような引数値が存在する必要があります。
つまり、この純粋関数は不正です。
constexpr int maybeInCppC1Y(int a, int b)
{
if (a>0)
return a+b;
else
return a-b;
//can be written as return (a>0) ? (a+b):(a-b); but that isnt the point
}
また、ローカル変数を定義することはできません... :(だから、これは設計上の決定なのか、それとも関数 a が純粋であることを証明することになると、コンパイラはうまくいかないのでしょうか?