#include <array>
#include <tuple>
typedef std::tuple<const int> TupleType;
constexpr std::array<const int, 2> a = {1, 2};
constexpr void foo()
{
for (std::size_t i = 0; i < a.size(); ++i)
{
const int j = i;
typedef std::tuple_element<j, TupleType> T;
}
}
コードは--std = CとGCC-7.2でコンパイルすることができない次のコンパイルエラーで++ 17:コンパイル時間型生成
error: the value of 'j' is not usable in a constant expression
note: in template argument for type 'long unsigned int'
関数(および対応するループ)がコンパイル時に評価されると仮定すると(これはC++ 14から始まるループで実行可能です)、なぜこのコードはがconstと宣言されていなくても、実際にはconstexprとなります。その値はすべてコンパイル時にもわかっています。
このコードがそのアイデアによって無効であるかどうかを教えてください。コンパイラの制限がありますか?または次のどれですか?