タイトルが尋ねるように:コンパイル時にconstexpr関数が呼び出されることを保証することはできますか?コンパイル時にconstexpr関数が呼び出されることを保証することはできますか?
関数がconstepxrでない場合、これは明らかに不可能です。私はスペースバーを押すたびに呼び出される関数を書くことができるので、コンパイラはコンパイル時にそれを決して理解できませんでした。
タイトルが尋ねるように:コンパイル時にconstexpr関数が呼び出されることを保証することはできますか?コンパイル時にconstexpr関数が呼び出されることを保証することはできますか?
関数がconstepxrでない場合、これは明らかに不可能です。私はスペースバーを押すたびに呼び出される関数を書くことができるので、コンパイラはコンパイル時にそれを決して理解できませんでした。
短い回答:いいえ、constexpr
機能は外部状態を読み取り/設定できません。 (内部状態を持つことはできますが、依然として "純粋"である必要があります)
本当の答え:おそらくはい、それは悪い考えです。 friend
船やADLを濫用することにより、ステートフルconstexpr
機能の実装をカバーフィリップRoséenにより、ブログの記事のシリーズがあります:
"NON-CONSTANT CONSTANT-EXPRESSIONS IN C++"から(cached by Google)
"HOW TO IMPLEMENT A CONSTANT-EXPRESSION COUNTER IN C++" - (cached by Google)
"HOW TO IMPLEMENT A COMPILE-TIME META-CONTAINER IN C++" - (cached by Google)
この手法は非常に難解で複雑です。これは、CWGによる機能の乱用とみなされます。which is trying to make it ill-formed with issue #2118
これらの3つの記事は適切です、私の+1!誰もこれらのテクニックを使うべきではないとあなたは正しいでしょう。 – rwols
(VERY SHOUTY)リンクは死んでいます –
@underscore_d:ありがとう、うまくいけばすぐに戻ってきます。 Googleのキャッシュリンクを追加しました –
constexprの式/関数には副作用がないため、呼び出される頻度は関係ありません(ランタイム/パフォーマンスを除く)。では、なぜconstexprが1回だけ評価されることを確認したいのですか? –
@WernerHenze "なぜ、constexprが一度だけ評価されるようにしたいのですか?"単に好奇心と言語の境界を見つけること:-) – rwols
@rwols:問題は、 "once once"はコンパイル時の 'constexpr'関数にとって無意味な概念です。文字通り1時間半(!)と呼ばれるかもしれません - 実装はconstexpr式の評価をキャッシュすることができます。これには部分的なキャッシュが含まれます。 – MSalters