std 名前空間に関して 'using' の使用についてはさまざまな見解があるようです。
' using namespace std
' を使うべきだと言う人もいれば、そうではなく、使用する std 関数の前に ' std::
' を付けるべきと言う人もいます。また、次のようなものを使うべきだと言う人もいます。
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::vector;
使用されるすべての std 関数に対して。
それぞれの長所と短所は何ですか?
ベストアンサー1
std::string
ほとんどの C++ ユーザーは、 、 などを読んで満足していますstd::vector
。実際、生の を見ると、これが なのか、それとも別のユーザー定義のvector
なのか疑問に思います。std::vector
vector
私は常に の使用に反対ですusing namespace std;
。 はあらゆる種類の名前をグローバル名前空間にインポートし、あらゆる種類の不明瞭な曖昧さを引き起こす可能性があります。
名前空間にある一般的な識別子には、count、sort、find、equal、reverse などがあります。std
というローカル変数があると、の代わりにを使用できなくなります。count
using namespace std
count
std::count
望ましくない名前の競合の典型的な例は、次のようになります。 初心者で について知らないと想像してくださいstd::count
。 で別のものを使用しているか<algorithm>
、一見無関係なヘッダーによって が取り込まれていると想像してください。
#include <algorithm>
using namespace std;
int count = 0;
int increment()
{
return ++count; // error, identifier count is ambiguous
}
このエラーは通常、長くてわかりにくいものになります。これは、std::count
テンプレートに長いネストされた型がいくつかあるためです。
std::count
ただし、これはグローバル名前空間に入り、関数 count によって隠されるため、問題ありません。
#include <algorithm>
using namespace std;
int increment()
{
static int count = 0;
return ++count;
}
少し驚くかもしれませんが、これは問題ありません。宣言スコープにインポートされた識別子は、定義されている場所とインポートされている場所の両方を囲む共通の名前空間に表示されます。つまり、 はグローバル名前空間でstd::count
として表示されますが、 の内部でのみ表示されます。count
increment
#include <algorithm>
int increment()
{
using namespace std;
static int count = 0;
return ++count;
}
同様の理由から、 はcount
ここでは曖昧です。は、 が外側を予想どおりに隠すusing namespace std
原因にはなりません。 このルールは、 が(関数内で) グローバル スコープ、つまり や と同じスコープで宣言されているように見えることを意味し、そのため曖昧さが生じます。std::count
count
using namespace
std::count
increment
int count = 0;
#include <algorithm>
int count = 0;
int increment()
{
using namespace std;
return ++count; // error ambiguous
}