returnステートメントのみで構成される関数は宣言できます
。したがって、すべての引数がであり、関数のみが本体で呼び出されるconstexpr
場合、コンパイル時に評価できます。そのような関数を宣言しない理由はありますか?constexpr
constexpr
constexpr
例:
constexpr int sum(int x, int y) { return x + y; }
constexpr i = 10;
static_assert(sum(i, 13) == 23, "sum correct");
constexpr
関数の宣言が害を及ぼす例を誰かが提供できますか?
いくつかの最初の考え:
関数を宣言する正当な理由がない場合でもconstexpr
、キーワードが過渡的な役割を果たしているとは想像できconstexpr
ませんでした。コンパイル時の評価を必要としないコードがないため、コンパイル時の評価を実装していないコンパイラでは、そのコードをコンパイルします(ただし、を使用して明示的に作成されたコードを必要とするコードでは確実に失敗しますconstexpr
)。
しかし、私が理解していないこと:関数を宣言しない正当な理由がない場合、標準ライブラリ内のすべてconstexpr
の関数が宣言されないのはなぜですか?(まだ十分な時間がなかったため、まだ完了していないと主張することはできません。すべての機能を実行するのは簡単です。すべての機能を実行するかどうかを決定するのとは対照的です。)-
--N2976は、コンテナなどの多くの標準ライブラリタイプにcstrを意図的に必要としないことを認識しています。これは、可能な実装には制限が多すぎるためです。それらを引数から除外して、疑問に思います。標準ライブラリの型に実際にcstrが含まれていると、それを操作するすべての関数が宣言されないのはなぜですか。constexpr
constexpr
constexpr
constexpr
?
constexpr
ほとんどの場合、コンパイル時の使用を想定していないという理由だけで関数を宣言したくないと主張することもできません。他の人がevtlを使用している場合です。あなたのコードを使用します、彼らはあなたがそうしないような使用を見るかもしれません。(ただし、もちろん、タイプ特性タイプなどには付与されます。)
だから私は、関数を故意に宣言しないための正当な理由と良い例があるに違いないと思いますconstexpr
か?
(「すべての関数」とは、常に意味しますconstexpr
。つまり、単一のreturnステートメントとして定義され、constexpr cstrsを持つ型の引数のみを取り、関数のみを呼び出すための要件を満たすすべての関数constexpr
。C++ 14以降、はるかに多くのこのような関数の本体で許可されています。たとえば、C ++ 14 constexpr関数はローカル変数とループを使用する可能性があるため、さらに幅広いクラスの関数を宣言できますconstexpr
。)
質問なぜstd::forward
捨てるのconstexpr
か?これの特殊なケースです。