Когда вы #include <iostream>
, это зависит от заголовка, чтобы включить любые другие заголовки и объявления и определения, которые ему нужны - стандарт C++ не запрещает его, включая больше, чем это необходимо для обеспечения требуемой функциональности. Очевидно, что с компилятором/версиями #include <iostream>
также включая достаточное количество определений, связанные с string
знать, что есть template <
... > std::basic_string::basic_string(const char*);
конструктора (std::string
является typedef
к конкретной конкретизацией basic_string
для char
) таким образом, что ваш код известен действительным:
string foo = "temporary";
Тем не менее, когда вы пошли в поток foo
, он явно не видел определение соответствия ала template <
... > std::ostream& operator<<(std::ostream&, const basic_string<
... >&)
, который определяет, как потоковое должно быть выполнено: именно поэтому компилятор не жаловался. Определение для operator<<
, вероятно, находится в вашем заголовке <string>
, поэтому оно действительно необходимо перед потоковой передачей string
.
Вы можете наблюдать это самостоятельно, попросив свой компилятор вывести и не удалять предварительно обработанные файлы, которые отображают блок перевода после расширения #include
. Вы найдете варианты, чтобы сделать это где-то в конфигурации сборки вашего проекта.
Все, поэтому иногда у вас может работать код с меньшим количеством включений, чем это необходимо. Если вы понимаете, что сделали это, всегда рекомендуется включать другие заголовки, обеспечивая переносимость других компиляторов и будущих версий одного и того же компилятора.
Idk, если вы можете полагаться на 'std :: string', включенный в' '.Кроме того, не загрязняйте глобальное пространство имен таким образом. используйте 'std ::'. –
CoffeeandCode
Ваша программа * уже * плохо сформирована, потому что вы не включаете заголовок ''. Вы не всегда получаете диагностику, когда совершаете ошибку на C++, но можете только утверждать, что ваша программа «работает», если вы не ошибетесь. Правила C++ не полностью исполняются компилятором. –
Возможно, потому что вы используете компилятор VC++: https://ideone.com/AAmPhN – CoffeeandCode