エイリアスに相当する別の名前空間内の 'using namespace'は使用していますか?
namespace foo = bar;
と
namespace foo {
using namespace bar;
}
これらの2つの文は同等ですか、それとも私が気づいていない微妙な違いがありますか?
(これはコーディングスタイルに関する質問ではないことに注意してください - 私はC++の解析に興味があります)。
エイリアスに相当する別の名前空間内の 'using namespace'は使用していますか?
namespace foo = bar;
と
namespace foo {
using namespace bar;
}
これらの2つの文は同等ですか、それとも私が気づいていない微妙な違いがありますか?
(これはコーディングスタイルに関する質問ではないことに注意してください - 私はC++の解析に興味があります)。
namespace foo=bar;
これは名前検索ルールには影響しません。唯一の影響は 'foo'を 'bar'のエイリアスにすることです。例えば:
namespace bar
{
void b();
}
void f() {
bar::b(); // Call 'b' in bar
foo::b(); // 'foo' is an alias to 'bar' so calls same function
}
次は、ルックアップは、 'I' のために行われると
namespace NS
{
namespace bar
{
}
namespace foo {
using namespace bar;
void f() {
++i;
}
}
}
は、 'fooは' を 'NS' し、 'bar' に、最初に検索される検索ルールを変更しません。
ネームスペースを別のネームスペースにインポートする場合は、そのネームスペースを同じにする必要があります。しかし、2番目のコードでは他のコードも置くことができるので、でないものをの名前空間fooの一部に入れることもできます。前者はエイリアスを作成するだけです。
名前が名前空間 'foo'に追加された場合、異なるルックアップ規則により、2つの例の間で異なる名前が見つかる可能性があります。 –
非常に遅いコメントに申し訳ありませんが、私は他の人が検索していると考えました。名前空間bar文を使用すると、その時点で定義されているものだけがfoo名前空間に持ち込まれます。要するに、悪い順序の依存関係を作成する可能性があります。 Sutter/AlexandrescuのC++コード標準 –
の#59を参照@RobL:_declaration_を使用すると、その時に宣言された名前のみが取り込まれます。上記は_directive_を使用しています。前者は、名前空間から現在のスコープへの名前の再宣言に似ています。後者は、あなたがここでそれを見つけなければ、この他の名前空間をチェックするならば、言葉を参照するルールのようなものです。 –