考慮以下兩個語句:在另一個名稱空間內使用等效於別名的'namespace'嗎?
namespace foo = bar;
和
namespace foo {
using namespace bar;
}
那兩個語句等價的,還是有一些細微的差別,我不知道的?
(請注意,這不是關於編碼風格的問題 - 我只是對C++解析感興趣)。
考慮以下兩個語句:在另一個名稱空間內使用等效於別名的'namespace'嗎?
namespace foo = bar;
和
namespace foo {
using namespace bar;
}
那兩個語句等價的,還是有一些細微的差別,我不知道的?
(請注意,這不是關於編碼風格的問題 - 我只是對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
}
下面是變化的查找規則
namespace NS
{
namespace bar
{
}
namespace foo {
using namespace bar;
void f() {
++i;
}
}
}
查找時發生了「我」,「富」將首先搜索,然後「NS」然後「吧」。
當你將一個命名空間導入到另一個命名空間時,那麼是的,它應該在這方面是平等的。但是,第二個也允許放置其他代碼,所以你也可以將其中的而不是的部分放在其中。前者只是創建一個別名。
如果將名稱添加到名稱空間'foo'中,則不同的查找規則可能會導致在兩個示例之間找到不同的名稱。 – 2009-08-13 10:59:09
很抱歉,很遲才發表評論,但我想其他人可能正在搜索。使用命名空間欄語句只會將當時定義的那些東西帶入到foo命名空間中。簡而言之,它可以創建錯誤的訂單依賴關係。請參閱Sutter/Alexandrescu的C++編碼標準中的項目#59 – 2016-12-09 18:45:48
@RobL:使用_declaration_僅引入當時聲明的名稱。以上是使用_directive_。前者就像是從命名空間到當前範圍的名稱重新聲明。後者更像是一個查找規則,如果你在這裏沒有找到它,那麼檢查這個其他的命名空間。 – 2016-12-16 09:37:56