
94
|
3 章 現代の C++ への移行
項目 15:可能な場面では常に constexpr を用いる
C++11 で最も混乱する新用語を表彰すれば、恐らく constexpr が受賞するでしょう。オブジェク
トに使用すれば本質的な意味は強化された const ですが、関数に使用した場合の意味は大きく異な
ります。この混乱はくぐり抜ける価値があります。表現したい内容が constexpr にふさわしい場面
では、間違いなく使用したくなるでしょう。
constexpr は、その値が単なる定数というよりも、コンパイル時に既知の定数であることを概念
的に表現します。この基礎概念から出発し、関数に対し constexpr を用いた場合は他にも多くの
ニュアンスを含みます。お楽しみの結末をばらさないように、ここでは constexpr 関数の実行結果
は const である、またはその値がコンパイル時に既知である、などとは想定できないとだけ述べて
おきます。恐らく最も興味を引かれる点は、これらの動作が仕様(feature)であるとされている点
でしょう。constexpr 関数は、const な結果を返さなくとも、またコンパイル時に既知でなくとも
良いのです!
まずは constexpr オブジェクトから始めましょう。constexpr オブジェクトは事実上 const
ですし、またコンパイル時に既知の値を保持します(厳密に言えば、値が決定されるのは翻訳
(translation)時です。また翻訳処理はコンパイル時