(Для конкретного контекста компилятора/платформы возьмите GCC 4.7 и Ubuntu 12.04 на x86_64)
Учитывая некоторую функцию f:
void f(int x, int y);
int nx = ...;
int ny = ...;
Один способ перебора для каждого значения (x,y) от (0,0) до (nx,ny):
for (int x = 0; x < nx; x++)
for (int y = 0; y < ny; y++)
f(x,y);
Пусть это скомпилируется в некоторый сгенерированный код Q1.
Мы напишем функцию g, которая:
for (auto it : g(Z))
f(it.x, it.y);
компилируется в код Q2.
Можно ли написать g так, чтобы Q2 был столь же эффективен, как Q1? Если да, то как? Если нет, то что самое близкое, что мы можем получить?
Вы можете изменить auto на auto& или auto&&, если это поможет.
Вы также можете заменить it.x на it.x() и it.y на it.y(), если это поможет.
(Напомним, что расширение for на основе диапазона — это всего лишь тип итератора по вашему выбору: C++11: оператор for на основе диапазона: время жизни "range-init"?)