Особисто я прочитав:
std::generate(numbers.begin(), numbers.end(), rand);
є "ми призначаємо все в діапазоні. Діапазон є numbers. Присвоєні значення є випадковими".
Моє початкове читання:
for (int& x : numbers) x = rand();
"ми робимо щось для всього в діапазоні. Діапазон є numbers. Що ми робимо, це присвоюємо випадкове значення."
Це дуже чорно схожі, але не однакові. Однією з правдоподібних причин, яку я міг би викликати до першого читання, є те, що я думаю, що найважливішим фактом цього коду є те, що він присвоює діапазон. Тож є ваше "чому я хотів би ...". Я використовую, generateтому що в C ++ std::generateозначає "присвоєння діапазону". Як і до речі std::copy, різниця між ними полягає в тому, з чого ви призначаєте.
Однак є незрозумілі фактори. На основі діапазону для циклів за своєю суттю більш прямий спосіб виразити, що діапазон є numbers, ніж алгоритми на основі ітераторів. Ось чому люди працюють над бібліотеками алгоритмів на основі діапазону: boost::range::generate(numbers, rand);виглядає краще, ніж std::generateверсія.
На відміну від цього, int&у вашому діапазоні циклу for є зморшка. Що робити, якщо тип значення діапазону не є int, тоді ми робимо щось надокучливо тонке, що залежить від того, наскільки він конвертований int&, тоді як generateкод залежить лише від повернення від randприсвоєння елементу. Навіть якщо тип значення такий int, я все одно можу зупинитися, щоб подумати, чи є це чи ні. Отже auto, що відкладає роздуми про типи, поки я не побачу, що їм присвоюють - auto &xя кажу "взяти посилання на елемент діапазону, який би тип не міг бути". Ще в C ++ 03, алгоритми (бо вони шаблони функцій) були способом приховати точні типи, тепер вони шлях.
Я думаю, що завжди було так, що найпростіші алгоритми мають лише незначну перевагу над еквівалентними циклами. Діапазон петель для поліпшення циклів покращує петлі (насамперед, видаляючи більшу частину шаблону, хоча в них є трохи більше, ніж це). Тож поля стають жорсткішими, і, можливо, ви передумаєте в деяких конкретних випадках. Але там все ще є різниця в стилі.