【问题标题】:Is it legal to place using tr1::shared_ptr in namespace std in header?在标题中的命名空间 std 中放置 using tr1::shared_ptr 是否合法?
【发布时间】:2013-05-03 20:02:02
【问题描述】:

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

namespace std
{
   using tr1::shared_ptr;
}

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

【问题讨论】:

  • Later versions should also support std::tr1。编译器不会删除整个命名空间;他们会将其中的内容复制到std,就像您尝试做的那样。所以将类型称为std::tr1::shared_ptr 应该不会有很长时间的问题。
  • @cassini Praetorian 说了什么^ 如果你想走自己的路,你必须在预处理器中进行编译器检查,以确保你不会在 C++11 支持上遇到冲突,并且未来,编译器,它很混乱,不那么灵活,也不那么便携。
  • @leetNightshade 其实就是以上所有。诚然,遗憾的是没有“编译器支持功能 X”检查,但对于大多数目的来说,对 C++ 版本进行简单的预处理器检查就足够了。

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


【解决方案1】:

从技术上讲,标准说如果你这样做,你就进入了未定义行为的领域:

17.6.4.2.1 命名空间标准 [namespace.std]

1 如果 C++ 程序添加声明或 对命名空间 std 或命名空间 std 内的命名空间的定义 除非另有说明。

但在实践中,您可能会侥幸逃脱。哎呀,甚至 Scott Meyers 在 Effective C++ 3rd Ed 中也提出了一个类似的未定义命名空间别名技巧。 (第 54 项,第 268 页)使用 Boost 功能作为缺少 tr1 功能的权宜之计。

namespace std { using namespace tr1 = ::boost; }

您的 using 声明也是未定义的行为,但请继续前进。

注意:在你的编译器版本和警告周围加上一个大警告#define#pragma,一旦你升级到一个实际上有std::shared_ptr 的编译器/库,请确保重新访问标头并删除代码。

【讨论】:

  • 添加到最后的注释:评论很好。但是,它们往往就是这样,cmets。如果您想要一些更有说服力的东西,请改用预处理器指令。类似于 #if defined( _MSC_VER ) && ( _MSC_VER > 1500 ) #error 请重新访问以下代码。 #endif 可能会在适当的时候触发某种动作。
  • 谢谢,但我不想在升级到新编译器后重新访问此代码。
  • @cassini 好吧,您处于未定义行为领域,因此您可能希望尽快消除该风险。当然,简单的重新编译不会有太大的伤害吗?
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多