#include требуется для использования списка инициализаторов на основе диапазона для?

Окончательный стандарт 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?

11
задан Derrick Turk 18 January 2012 в 16:29
поделиться