使用するフォームが実際に違いを生む可能性がある (確かに、やや珍しい) 状況が 1 つあります。使用したいフォームは using namespace foo
であり、最も一般的にはstd
名前空間 (つまり、 を記述する場所) に適用されますusing namespace std;
。
最も明白な例は、ユーザー定義型の並べ替えを作成していることです。これは、ユーザーが独自に定義した型にも適用される可能性swap
があります。
スワップが定義されている場合はスワップを使用したいが、定義されていない場合は std::swap を使用したいという状況に陥っています。std::swap
コードで直接使用するとstd::swap
、型に独自のスワップが定義されていても、使用することになります。逆に、特に型にスワップを直接指定し、何も指定していない場合、コードはコンパイルに失敗します。
これを回避するには、次のようにします。
using namespace std;
template <class Iter>
void my_sort(Iter first, Iter last) {
// ...
if (*last < *first)
swap(*first, *last);
}
これは、比較対象の型 (つまり、swap
その型と同じ名前空間で定義された ) に固有のスワップを見つけ、存在する場合は (引数依存のルックアップを介して) std::swap
、その型に何も定義されていない場合は ( を介してusing namespace std;
) 見つけます。
これはパフォーマンスに影響を与える可能性があります。そのタイプ専用のスワップを記述している場合、一般的には、そうすることでパフォーマンスが向上することが期待できます。つまり、明示的に指定するとstd::swap
機能する可能性がありますが、パフォーマンスが低下する可能性があります。
std::swap
それ以外の場合は、ほぼ完全に利便性と読みやすさの問題です --上記のような状況 (コードを書いている時点で) 少なくとも 2 つの可能性のいずれかの場合を除いて、私はほとんどフルネーム (例: ) を付けることを好みます。適切なものを選択する十分な余裕をコンパイラに与えたいと思います。
宣言/ディレクティブの使用が役立つと思うもう 1 つのケースは、名前空間が非常に深くネストされている場合です。Boost (わかりやすい例の 1 つ) には、毎回完全修飾名を使用すると便利に使用するには長すぎる名前がいくつかあります。これは、(現在、ありがたいことに、ほとんど廃止された)Boost Lambda ライブラリに特に当てはまりました。ここでは、のようなプレースホルダーを使用_1
していましたが、最終的には次のようになりましたboost::lambda::placeholders::_1
(ただし、メモリから行っているため、少なくとも部分的に間違っている可能性があります)。完全修飾名を使用することを主張しました。それはそもそもラムダライブラリを使用する目的の大部分を無効にしていたでしょう.