#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;
}
}
Код не может быть скомпилирован с помощью gcc-7.2 с --std = c ++ 17 со следующими ошибка компиляции:
error: the value of 'j' is not usable in a constant expression
note: in template argument for type 'long unsigned int'
Если мы предположим, что функция (и соответствующий цикл) оценивается во время компиляции (что применимо для циклов, начиная с c ++ 14), почему тогда этот код не может быть скомпилирован, поскольку, хотя i не объявлен как const, на самом деле он может быть constexpr, поскольку все его значения также известны во время компиляции.
Не могли бы вы пояснить, недействителен ли этот код по самой его идее? Или есть ограничение компилятора? Или ничего из следующего?