使用std::tr1::shared_ptr
作为std::shared_ptr
将using
指令放在相应的标题中,是否合法且良好的编程风格?像这样:
namespace std
{
using tr1::shared_ptr;
}
我知道污染整个命名空间是不好的,但这种情况怎么样?有没有隐藏的陷阱?目标编译器是VS2008,但也需要与更高版本兼容。
答案 0 :(得分:3)
从技术上讲,如果您这样做,标准会说您进入未定义行为领域:
17.6.4.2.1命名空间std [namespace.std]
1如果添加声明或者C ++程序的行为是未定义的 定义命名空间std或命名空间std中的命名空间 除非另有说明。
但在实践中,你很可能会逃脱它。哎呀,甚至Scott Meyers在Effective C ++ 3rd Ed中提出了一个类似的未定义的命名空间别名技巧。 (第54项,第268页)使用Boost功能作为缺失tr1
功能的权宜之计。
namespace std { using namespace tr1 = ::boost; }
您的使用声明也是未定义的行为,但请继续并直接进入。
注意:在您的编译器版本和警告周围添加一个大胖警告,#define
和#pragma
,并在升级到实际具有std::shared_ptr
的编译器/库时立即对其进行评论,请务必重新访问该标题并删除代码。