A. 以下のような、「名前空間汚染」と呼ばれる害悪を引き起こすからです。
特に複数人で、比較的大きなコードを書く場合は強く効いてきます。
ここでは、 std を名前空間の例として挙げていますが、std に限りません。
わざとらしい例だと、以下のような感じです。
std::max と、struct max が同じ名前空間で使えなくなります。
#include <algorithm>
#include <iostream>
using namespace std;
struct max {}; // std::max と曖昧
int main(int argc, char *argv[]) {
int a = max(1, 2); // error: reference to 'max' is ambiguous
cout << a << endl;
return 0;
}名前が std のものと被っていると、曖昧だとしてコンパイルが通らなかったりすることも多いです。
ですが、万が一コンパイルが通ったとしても、とても紛らわしいです。
レビュー時や、他の人のコードを読んでいる時に嫌になっちゃいます。
大きなコードベースだと読む気がなくなります。
#include <algorithm> // std::max
#include <iostream>
using namespace std;
int max(int a, int b) {
return (a > b) ? a : b;
}
int main(int argc, char *argv[]) {
int a = max(1, 2); // こんなコードは嫌だ。動くけど。
cout << a << endl;
return 0;
}文字通りです。新しいコンパイラや将来のことを考えながらコードを書くなんて嫌ですよね?
その通りです。
AtCoder は以下のことが前提になっているため、上記のようなことは意識する必要がないか、「自分が注意すればいいじゃん」で済む内容です。
- 短い時間で
- 比較的小さなコードを
- 個人で書く
でも、複数人で協力して、比較的長いスパンで大規模なコードを書くソフトウェア開発だと、これまで説明したことに注意しながらコードを書かなければならないのは、生産性を下げる害悪でしかありません。
なので、「名前空間汚染」を引き起こす言語機能を安易に使うことは、 C++ に限らず(*1) 、良くないプラクティスだとされていると思いますし、規約で禁止していることも珍しくありません(*2)
(*1) たとえば Python とかでも、 from hoge import * とかはわかりやすい最悪のコードです。理由がない限りやりません。
(*2) たとえば Google C++ Style Guide でも、using namespace foo; を 明確に禁止しています。
「名前空間汚染」でググってみると、いろいろ出てくると思います。