众所周知,向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
添加任何内容。我测试过的每个编译器似乎都很乐意接受这个。
在某人发表评论之前,“为什么你会这样做?” - 这只是为了满足我的好奇心......
答案 0 :(得分:4)
只要您不在全局声明区域中,重新定义std
作为别名就可以了:
在声明性区域中,可以使用namespace-alias-definition重新定义在该声明性区域中声明的名称空间别名,以仅引用它已引用的名称空间。
由于您在main()
中定义了别名,因此会隐藏全局std
名称。这就是为什么这个工作,应该工作,并根据标准完全没问题。你没有向std
命名空间添加任何内容,而这种“hack”只会让人类读者混淆代码。
答案 1 :(得分:1)
在main
内,在命名空间别名定义之后,std
引用std
命名空间的别名std_
。隐藏了“通常”std
命名空间,就像函数局部变量隐藏具有相同名称的全局变量一样。
答案 2 :(得分:0)
您没有向std::
添加任何内容。您正在添加std_::
,然后声明名为std::
的别名。
我从来不知道有一条规则无法添加到std::
。那是对的吗?如果是这样,我猜测该规则仅用于保留命名空间以供将来扩展。所以如果你真的想要扩充std::
,你真的不需要做任何事情。
如果您知道编译器不允许这样的事情,可以发帖...