Почему нет ошибки компиляции, если не включать файл заголовка initializer_list? - PullRequest
0 голосов
/ 09 апреля 2020

Я только что видел, как чей-то блог написал этот пример кода, иллюстрирующий простое использование initializer_list, появившегося в C ++ 11:

#include <iostream>
//#include <initializer_list>
using namespace std;

void print(initializer_list<int> list) {
    for(auto it = list.begin(); it!=list.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

int main() {
    print({1,2,3,4,5,6,7});
    return 0;
}

Однако я тестировал в Ubuntu16.04 с g ++ - 5.4 и clang ++ - 8, также протестированные с Visual Studio 2017, все они компилируются нормально, без каких-либо ошибок компиляции . Я странствую, почему закомментированный #include <initializer_list> не требуется.

Моя команда компиляции:

g++ main.cpp -std=c++11 -Wall

Не включая initializer_list заголовочный файл, как компилятор C ++ нашел свое определение?

И еще сбивает с толку, когда я должен принудительно включать в себя заголовочный файл initializer_list?

Выяснил по VS2017. Это длинное включение.

iostream <- istream <- ostream <- ios <- xcolumn <- streambuf <- xiosbase <- xlocale <- stdexcept <- xstring <- xmemory0 <- xutility <- utility <- xstddef <- initializer_list </p>

Ответы [ 3 ]

0 голосов
/ 09 апреля 2020

Он должен быть либо включен через заголовок <iostream>, поскольку он часто используется, либо компилятор может быть включен по умолчанию по той же причине полезности.

Возможно, вы захотите добавить только <initializer_list> когда компилятор жалуется на это.

0 голосов
/ 09 апреля 2020

Не включая <initializer_list> - неопределенное поведение. Это работает в этом случае, потому что в этой конкретной реализации <iostream> включает его, но это не требуется.

0 голосов
/ 09 апреля 2020

Нет ошибки компилятора, потому что включение <iostream> также будет включать <initializer_list>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...