constexpr
関数がコンパイル時に確実に評価されるようにするには、その結果を作成することによって強制する必要がありますconstexpr
。例えば:
#include <array>
int
main()
{
constexpr std::array<int, 5> arr{1, 2, 3, 4, 5};
int i = arr[6]; // run time error
}
でも:
#include <array>
int
main()
{
constexpr std::array<int, 5> arr{1, 2, 3, 4, 5};
constexpr int i = arr[6]; // compile time error
}
残念ながら、これが実際に機能するにstd::array
は、C++11 仕様ではなく、C++14 仕様に準拠する必要があります。C++11 仕様はwithのconst
オーバーロードをマークしていないためです。std::array::operator[]
constexpr
したがって、C++11 では運が悪いのです。C++14 では、それを機能させることができますがarray
、インデックス演算子を呼び出した結果と結果の両方が宣言されている場合に限りconstexpr
ます。
明確化
配列のインデックス付けに関する C++11 の仕様は次のとおりです。
reference operator[](size_type n);
const_reference operator[](size_type n) const;
また、配列のインデックス付けに関する C++14 の仕様は次のとおりです。
reference operator[](size_type n);
constexpr const_reference operator[](size_type n) const;
IeがC++14constexpr
のオーバーロードに追加されました。const
アップデート
また、配列のインデックス付けに関する C++17 の仕様は次のとおりです。
constexpr reference operator[](size_type n);
constexpr const_reference operator[](size_type n) const;
これでサイクルは完了です。ユニバースはコンパイル時に計算できます。;-)