2

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

那么下面的“hack”呢?

#include <iostream>

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

  using namespace std;
}

int main()
{
  namespace std = std_;

  std::Foo();
}

就标准而言,这真的定义得很好吗?当然,在这种情况下,我真的没有添加任何东西namespace std。我测试过的每个编译器似乎都乐于接受它。


在有人发表类似“你为什么要那样做?”的评论之前。——这只是为了满足我的好奇心……

4

3 回答 3

4

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

在声明性区域中,命名空间别名定义可用于重新定义在该声明性区域中声明的命名空间别名,以仅引用它已经引用的命名空间。

由于您在 中定义别名main(),因此它会隐藏全局std名称。这就是为什么它有效,应该有效,并且根据标准完全没问题。您没有向std名称空间添加任何内容,并且这种“hack”只会使代码的人类读者感到困惑。

于 2010-06-27T17:55:23.353 回答
1

main命名空间别名定义之后的内部,std指的是命名空间的std别名std_。“通常”的std命名空间是隐藏的,就像函数局部变量会隐藏同名的全局变量一样。

于 2010-06-27T17:59:22.330 回答
0

您没有向std::. 您正在添加std_::,然后声明一个名为std::.

我从来不知道有一条规则是你不能添加的std::。那是对的吗?如果是这样,我猜该规则的存在只是为了保留名称空间以供将来扩展。因此,如果您真的想扩充std::.

如果您知道不允许此类事情的编译器,请有人发帖...

于 2010-06-27T18:14:33.830 回答