В C ++ 17 диапазон для цикла определяется как
{
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
И
range_declaration = *__begin;
Точка инициализации переменной диапазона. Обычно *__begin
возвращает ссылку, поэтому в
for (const auto& e : range_that_returns_references)
e
можно исключить, и мы можем просто работать с элементом из диапазона. В
for (const auto& e : range_that_returns_proxies_or_copies)
e
нельзя уничтожить. *__begin
создаст прокси или копию, а затем мы привязаем это временное значение к e
. Это означает, что в каждой итерации у вас есть объект, который создается и уничтожается, что может быть дорогостоящим и неочевидным, так как вы используете ссылку. Предупреждение требует, чтобы вы использовали не ссылочный тип, чтобы было очевидно, что вы на самом деле работаете не с элементом из диапазона, а с его копией / прокси.