1

重複の可能性:
std 名前空間の使用

たとえば、 std::sort() など、一部の操作に std:: を含める理由があるかどうか疑問に思っていました。過負荷の可能性があるためですか?

4

1 に答える 1

1

不必要なシンボル名と可読性で現在の名前空間を汚染する通常よく知られている理由とは別に、微妙な別の理由があります。

std::swapの例を考えてみましょう。これは、2 つの値を交換する標準ライブラリ アルゴリズムです。Koenig アルゴリズム/ADLでは、次の理由から、このアルゴリズムを使用する際には注意が必要です。

std::swap(obj1,obj2);    

以下と同じ動作を示さない場合があります。

using std::swap;
swap(obj1, obj2);

ADL では、どのバージョンのswap関数が呼び出されるかは、渡された引数の名前空間によって異なります。
名前空間が存在し、&が存在するA場合、2 番目の例では、ユーザーが望んでいない呼び出しが行われる可能性があります。A::obj1A::obj2A::swap()A::swap()

さらに、何らかの理由で :
A::swap(A::MyClass&, A::MyClass&)との両方std::swap(A::MyClass&, A::MyClass&)が定義されている場合、最初の例は呼び出されますが、2 番目の例はあいまいになるstd::swap(A::MyClass&, A::MyClass&)ためコンパイルされません。swap(obj1, obj2)

于 2013-02-03T04:45:58.310 に答える