Почему не является выражением времени компиляции?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему не является выражением времени компиляции?

Сообщение Anonymous »

Если я хочу сделать что -то вроде итерации над кортежом, я должен прибегнуть к сумасшедшему шаблонному метапреграммам и специализациям вспомогательных шаблонов. Например, следующая программа не будет работать: < /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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»