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