std名前空間の使用 [重複] 質問する

std名前空間の使用 [重複] 質問する

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::vectorvector

私は常に の使用に反対ですusing namespace std;。 はあらゆる種類の名前をグローバル名前空間にインポートし、あらゆる種類の不明瞭な曖昧さを引き起こす可能性があります。

名前空間にある一般的な識別子には、count、sort、find、equal、reverse などがあります。stdというローカル変数があると、の代わりにを使用できなくなります。countusing namespace stdcountstd::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として表示されますが、 の内部でのみ表示されます。countincrement

#include <algorithm>

int increment()
{
    using namespace std;
    static int count = 0;
    return ++count;
}

同様の理由から、 はcountここでは曖昧です。は、 が外側を予想どおりに隠すusing namespace std原因にはなりません。 このルールは、 が(関数内で) グローバル スコープ、つまり や と同じスコープで宣言されているように見えることを意味し、そのため曖昧さが生じます。std::countcountusing namespacestd::countincrementint count = 0;

#include <algorithm>

int count = 0;

int increment()
{
    using namespace std;
    return ++count; // error ambiguous
}

おすすめ記事