Если я хочу сделать что -то вроде итерации над кортежом, я должен прибегнуть к сумасшедшему шаблонному метапреграммам и специализациям вспомогательных шаблонов. Например, следующая программа не будет работать: < /p>
Код: Выделить всё
#include
#include
#include
constexpr auto multiple_return_values()
{
return std::make_tuple(3, 3.14, "pi");
}
template
constexpr void foo(T t)
{
for (auto i = 0u; i < std::tuple_size::value; ++i)
{
std::get(t);
}
}
int main()
{
constexpr auto ret = multiple_return_values();
foo(ret);
}
Потому что я не может быть const или мы не сможем его реализовать. Но для петли-это конструкция времени компиляции, которая может быть оценена по статически. Компиляторы могут свободно удалять его, преобразовать, сложить, развернуть его или делать с ним все, что они хотят, благодаря правилу AS-I, если. Но тогда почему петли нельзя использовать в манере contexPR? В этом коде нет ничего, что нужно сделать во время выполнения. Оптимизация компилятора является доказательством этого. < /P>
Я знаю, что вы могли бы потенциально изменить i < /code> внутри корпуса цикла, но компилятор все еще может обнаружить это. Пример: < /p>
Код: Выделить всё
// ...snip...
template
constexpr int foo(T t)
{
/* Dead code */
for (auto i = 0u; i < std::tuple_size::value; ++i)
{
}
return 42;
}
int main()
{
constexpr auto ret = multiple_return_values();
/* No error */
std::array arr;
}
Поскольку std :: get () -конструкция времени компиляции, в отличие от std :: cout.operator
Подробнее здесь:
https://stackoverflow.com/questions/376 ... expression