
項目 15:可能な場面では常に constexpr を用いる
|
99
ることを意味するのです10! さらに、コンパイル時処理と実行時処理の従来の厳密な境界は曖昧に
なり、また従来は実行時に行われていた一部の算出をコンパイル時処理に移行できることも意味し
ます。移行できるコード量が増えるほど、ソフトウェアの実行は高速化できます(コンパイル時間
は延びるけれど)。
C++11 では、Point のメンバ関数 setX と setY を constexpr と宣言できません。その原因で
ある制約は 2 つあります。1 つ目は、setX、setY がオブジェクトを変更するのに対し、C++11 の
constexpr メンバ関数は暗黙に const になることにあります。2 つ目は、setX、setY の戻り型が
void であるのに対し、C++11 では void をリテラル型としていないことです。C++14 ではこの 2 つ
の制約を解除しており、Point のセッタでも constexpr と宣言できます。
class Point {
public:
…
constexpr void setX(double newX) noexcept // C++14
{ x = newX; }
constexpr void setY(double newY) noexcept // C++14
{ y = newY; }
…
};
上例を用いると次のような関数も記述できます。
// return reflection of p with ...