質問: 標題の通りです。 constexprな基本型の利点は、コンパイル時定数により、実行速度が向上することだと理解できます。 クラスがリテラル型になる条件の一つは、「非staticデータメンバが、非volatileなリテラル型である」ことです。 引用サイト(3.9の最後、3.9.1の直前): C++11: Syntax and Feature この条件のために、クラスをリテラル型にしても、できることが非常に限られたクラスになってしまいます。 ここまでして、リテラル型なクラスを使用する利点も、実行速度が向上することなのでしょうか。 追記 質問を書いていて思いました。 逆に、複雑なことをする必要がないクラスならconstexprにできるので、実行速度を向上させることができる、と考えることができるのかもしれません。
回答: > > ここまでして、リテラル型なクラスを使用する利点も、実行速度が向上することなのでしょうか。 > > > クラスに限らず、`constexpr`は速度向上が目的ではなく、コンパイル時に定数となることを保証するのが目的だと思います。従来からある`const`は、必ずしも定数とは限りませんからね。 これにより、従来なら関数や変数が使えなかった場所、例えば配列のサイズなどに使うことで、結果的に速度向上をもたらすということではないでしょうか。 > > 逆に、複雑なことをする必要がないクラスならconstexprにできるので、実行速度を向上させることができる、と考えることができるのかもしれません。 > > > これはあまり正しい認識ではないです。`constexpr`指定可能なコードであれば、`constexpr`がなくても最適化によりコンパイル時点で結果が求まります。いわゆるテンプレートメタプログラミングに代表されるようなコンパイル時点で結果を求める手法はすでに存在していますから。 ただ、`constexpr`を使えば、テンプレートメタプログラミングよりも直感的にコードが書けるという利点はあります。 訂正 他の環境では試していませんが、VC++で試したところ、再帰呼び出しなどの複雑な関数では`constexpr`を付けるか付けないかで結果が変わりました。付けると定数に置き換わりますが、付けないと関数呼び出しになっていました。どうやら最適化のロジックにも影響を及ぼしているようです。 テンプレートメタプログラミングの例があるのでばっちり最適化してくれると思い込んでいたのですが、よく考えたら、テンプレートメタプログラミングは再帰呼び出しではなく、「メンバ変数の再帰的な使用」なので、ちょっと違っていますね。 その意味では、「実行速度を向上させることが目的」というのも間違いではないようです。