Окончательный стандарт С++ 11 включает положения о том, что на основе диапазона for «просто работает» для собственных массивов без необходимости включать <iterator>
или любой другой заголовок. Насколько я могу судить, впервые это было рассмотрено в рабочем документе n2900 в результате комментариев UK 78 и 79.
Это предложение также включало положение о неявном #include <initializer_list>
в каждой единице перевода, так что, например. программа
#include <iostream>
int main()
{
for (auto i : { 1, 2, 3, 4, 5 })
std::cout << i << "\n";
}
будет соответствовать стандарту даже без включения <initializer_list>
.
Однако, когда концепции были удалены из C++11, диапазон for был пересмотрен, как показано в n2930. Хотя положение о том, что массивы «просто работают», остается, нет упоминания о том, что то же самое верно и для списков инициализаторов; действительно, спецификация, согласно которой заголовки контейнеров различных стандартных библиотек будут #include <initializer_list>
, и окончательный текст 8.5.4.2 подразумевает обратное для меня.
Насколько я могу судить, это довольно близко к окончательной формулировке по теме. Итак, является ли приведенная выше программа корректной по отношению к окончательному стандарту, или мне нужно #include <initializer_list>
даже использовать ее в диапазоне? Иными словами, является ли использование списка инициализаторов в диапазоне for «использованием std::initializer_list
--- даже неявным использованием, в котором тип не назван» в соответствии с 8.5.4.2 FDIS?