C ++中的命名空间别名

时间:2010-06-27 17:52:24

标签: c++ namespaces std undefined-behavior aliasing

众所周知,向namespace std添加声明/定义会导致未定义的行为。此规则的唯一例外是模板特化。

以下“黑客”怎么办?

#include <iostream>

namespace std_
{
  void Foo()
  {
    std::clog << "Hello World!" << std::endl;
  }

  using namespace std;
}

int main()
{
  namespace std = std_;

  std::Foo();
}

就标准而言,这是否真的定义明确?在这种情况下,我当然不会向namespace std添加任何内容。我测试过的每个编译器似乎都很乐意接受这个。


在某人发表评论之前,“为什么你会这样做?” - 这只是为了满足我的好奇心......

3 个答案:

答案 0 :(得分:4)

只要您不在全局声明区域中,重新定义std作为别名就可以了:

  

在声明性区域中,可以使用namespace-alias-definition重新定义在该声明性区域中声明的名称空间别名,以仅引用它已引用的名称空间。

由于您在main()中定义了别名,因此会隐藏全局std名称。这就是为什么这个工作,应该工作,并根据标准完全没问题。你没有向std命名空间添加任何内容,而这种“hack”只会让人类读者混淆代码。

答案 1 :(得分:1)

main内,在命名空间别名定义之后,std引用std命名空间的别名std_。隐藏了“通常”std命名空间,就像函数局部变量隐藏具有相同名称的全局变量一样。

答案 2 :(得分:0)

您没有向std::添加任何内容。您正在添加std_::,然后声明名为std::的别名。

我从来不知道有一条规则无法添加到std::。那是对的吗?如果是这样,我猜测该规则仅用于保留命名空间以供将来扩展。所以如果你真的想要扩充std::,你真的不需要做任何事情。

如果您知道编译器不允许这样的事情,可以发帖...