在头文件中的命名空间std中使用tr1 :: shared_ptr放置是否合法?

时间:2013-05-03 20:02:02

标签: c++ visual-studio-2008 visual-c++ tr1

使用std::tr1::shared_ptr作为std::shared_ptrusing指令放在相应的标题中,是否合法且良好的编程风格?像这样:

namespace std
{
   using tr1::shared_ptr;
}

我知道污染整个命名空间是不好的,但这种情况怎么样?有没有隐藏的陷阱?目标编译器是VS2008,但也需要与更高版本兼容。

1 个答案:

答案 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的编译器/库时立即对其进行评论,请务必重新访问该标题并删除代码。