C++ 是';使用名称空间';在另一个相当于别名的命名空间中?
考虑以下两种说法:C++ 是';使用名称空间';在另一个相当于别名的命名空间中?,c++,namespaces,C++,Namespaces,考虑以下两种说法: namespace foo = bar; 及 这两种说法是等价的,还是有一些细微的差别我不知道 (请注意,这不是一个关于编码风格的问题——我只是对C++解析感兴趣)。< p>当你将命名空间导入另一个时,那么,在这方面应该是相等的。但是,第二个还允许在其中放置其他代码,因此您也可以将不属于名称空间foo的内容放在其中。前者只是创建了一个别名 namespace foo=bar; 这不会影响任何名称查找规则。唯一的影响是使“foo”成为“bar”的别名。例如: namespa
namespace foo = bar;
及
这两种说法是等价的,还是有一些细微的差别我不知道
(请注意,这不是一个关于编码风格的问题——我只是对C++解析感兴趣)。
< p>当你将命名空间导入另一个时,那么,在这方面应该是相等的。但是,第二个还允许在其中放置其他代码,因此您也可以将不属于名称空间foo的内容放在其中。前者只是创建了一个别名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;
}
}
}
当对“i”进行查找时,将首先搜索“foo”,然后搜索“NS”,然后搜索“bar”。如果名称被添加到名称空间“foo”,则不同的查找规则可能会导致在两个示例之间找到不同的名称。很抱歉,评论太晚,但我认为其他人可能正在搜索。usingnamespace-bar语句只将当时定义的内容带入foo名称空间。简言之,它可以创建错误的顺序依赖关系。参见萨特/Alexandrescu C++编码中的第59项Standards@RobL:using声明只引入当时声明的名称。以上是一个使用指令。前者类似于将名称从名称空间重新声明到当前范围。后者更像是一个查找规则,如果您在这里找不到它,请检查另一个名称空间。
namespace NS
{
namespace bar
{
}
namespace foo {
using namespace bar;
void f () {
++i;
}
}
}