Ответ 1
Рассмотрим эту программу:
line#
1 #include <string>
2
3 using namespace std;
4
5 struct string { const char* p; }; // Beware: another string!
6
7 int main()
8 {
9 string x; // Error: ambiguous - which string is wanted?
10 }
Если вы попытаетесь скомпилировать его, вы увидите ошибки:
g++ using.cc -o using
using.cc: In function `int main()':
using.cc:9: error: use of `string' is ambiguous
using.cc:5: error: first declared as `struct string' here
/usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stringfwd.h:60: error:
also declared as `typedef struct std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::string' here
using.cc:9: error: `string' was not declared in this scope
using.cc:9: error: expected `;' before "x"
Проблема заключается в том, что когда main()
указывает string x;
, компилятор не уверен, требуется ли пользовательский ::string
или включенный std::string
.
Теперь представьте, что вы берете верхнюю часть программы... строки с 1 по 5 - вплоть до struct string
и включаете ее в файл заголовка, который затем #include
до main()
. Ничего не меняется: у вас все еще есть ошибка. Таким образом, как и для автономных программ, заголовочные файлы с операторами using
в них могут вызывать проблемы для другого кода, который включает их, делая некоторые из своих операторов двусмысленными.
Это может быть большая боль, хотя, поскольку заголовки могут быть включены - прямо или косвенно - произвольно огромным количеством зависимого кода и...
- удаление инструкции
using
из заголовка или - изменение содержимого
<string>
или любого другого заголовка, влияющего наstd::
... может сломать код, включая проблемный заголовок. Любая проблема может привести к тому, что зависимый код будет несовместимым, и проблемы могут даже не замечаться до тех пор, пока не будет предпринята попытка другой компиляции. Кроме того, человек, страдающий из-за оператора using
, может не иметь разрешений на файловую систему/код-репозиторий, корпоративные полномочия и т.д., Чтобы удалить инструкцию using
из заголовка и не исправить другой код клиентского кода.
Тем не менее, если заголовок имеет только "использование" внутри класса или функции, тогда нет никакого влияния на код за пределами этой области, поэтому потенциальное влияние изменений на std:: значительно уменьшается.