"использование пространства имен std;"до "#include <foo>" - PullRequest
0 голосов
/ 31 марта 2012

Каковы различия в скомпилируемости или сгенерированном коде (если есть) между следующими двумя исходными файлами:

Приложение A :

namespace std {};
using namespace std;
#include <vector>
#include <string>

<any code here>

Приложение B :

#include <vector>
#include <string>
using namespace std;

<any code here>

Предполагается, что два заполнителя <any code here> заменяются любым идентичным кодом пользователя.

Другими словами: есть ли какая-либо видимая разница для пользователя, если "с использованием пространства именстанд;»ставится перед стандартом #includes (при условии, что пространство имен std было введено, как указано выше)?

Ответы [ 2 ]

5 голосов
/ 31 марта 2012

Как бы маловероятно это ни было, следующий код может быть в векторном заголовке вашей реализации:

namespace __AA
{
    class vector {};
}

namespace std
{
    // actual std::vector implementation here
}

namespace __BB
{
    using namespace __AA;
    vector x;
}

Теперь, имея Приложение A , вы получите двусмысленность.

1 голос
/ 31 марта 2012

В любой практической реализации стандартной библиотеки не будет никакой разницы, поскольку директива using не будет влиять на определения внутри пространства имен std (поскольку std уже является текущей областью действия).

Если бы любая реализация стандартной библиотеки была бы негативно затронута в любом случае, я бы счел это серьезным дефектом качества реализации.

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