関数にマークをconstexpr
付けると、インライン関数にもなります§[dcl.constexpr] / 1:
constexpr指定子で宣言された関数または静的データメンバーは、暗黙的にインライン関数または変数です(7.1.6)。
inline
、順番に、あなたはそれが使用される可能性のあるすべての翻訳単位にその関数の定義を含める必要があることを意味します。つまり、constexpr
機能は次のいずれかでなければなりません。
- 1つの翻訳単位での使用に制限されている、または
- ヘッダーで定義されます。
ヘッダーで宣言し、ソースファイルで定義する最も一般的な関数(およびそれらを使用するものはすべてヘッダーのみを含み、そのソースのオブジェクトファイルに対するリンク)は、constexpr
単に機能しません。
理論的には、すべてをヘッダーに移動し、すべてのヘッダーを含むソースファイルを1つだけ持つことができると思いますが、これによりコンパイル時間が大幅に遅くなり、ほとんどの深刻なプロジェクトではコンパイルに膨大な量のメモリが必要になります。
constexpr
この関数はまた、いくつかの点で制限されているので、いくつかの機能のために、それはすべての選択肢ではないかもしれません。制限事項は次のとおりです。
- 仮想関数はできません
constexpr
。
- 戻り値の型は「リテラル型」でなければなりません(たとえば、非trival ctorまたはdtorを持つオブジェクトはありません)。
- パラメーターはすべてリテラル型である必要があります。
- 関数本体に
try
ブロックを含めることはできません。
- 非リテラル型の変数定義、または静的またはスレッドの保存期間を持つものを含めることはできません。
あいまいなことをいくつかスキップしました(たとえば、a goto
やasm
statementを含めることもできません)が、アイデアは得られます。
一番下の行:はい、これが悪いアイデアになるかなりの状況があります。