Если вы используете что-то в стандартной библиотеке, вы должны включить заголовок, в котором это определено. Это единственный портативный вариант. Таким образом вы избегаете цитируемого вами случая, когда один заголовок включает другой в одну версию или компилятор, но не другой. auto_ptr
определено в <memory>
, поэтому, если вы используете его, включите этот заголовок.
[править ...]
В ответ на ваш комментарий ... Вы спрашиваете, может ли компилятор определить, когда вы используете что-то из стандартного заголовка, который вы не включили напрямую? Это было бы полезно, но я думаю, что это слишком много, чтобы спросить. Для этого потребуется, чтобы компилятор знал, какие заголовки стандартной библиотеки содержат какие определения стандартной библиотеки, а затем проверил, что вы включили правильные заголовки для используемых вами определений.
Точное определение способа включения заголовка - тоже непростая задача. Если вы используете стандартное определение библиотеки, то вы должны каким-то образом включить заголовок. Компилятор должен будет указать, включили ли вы заголовок самостоятельно (возможно, через собственные или сторонние заголовки библиотеки) или он пришел через заголовок другой стандартной библиотеки. (Например, в вашем примере он должен быть в состоянии определить разницу между <memory>
, включенным через <string>
или включенным в ваш собственный код.)
Это должно было бы обрабатывать разные версии стандартной библиотеки (например, C ++ 03 и C ++ 0x) и разных поставщиков. А что, если эти поставщики стороннего stdlib не следуют стандарту, вы можете получить неверные предупреждения о том, какие заголовки включить.
Я только говорю это, чтобы попытаться объяснить (с моим ограниченным знанием компилятора / stdlib), почему я не думаю, что компиляторы имеют эту функцию. Я согласен, это было бы полезно, но я думаю, что цена перевешивает выгоду.