使用向后移植的代码扩展 std 命名空间

Extending std namespace with backported code

提问人:AMA 提问时间:2/8/2018 最后编辑:AMA 更新时间:2/8/2018 访问量:176

问:

一些背景:

扩展是未定义行为 (UB),除非它是模板专业化 [1]:namespace std

向其添加声明或定义是未定义的行为 命名空间 std 或嵌套在 std 中的任何命名空间,有几个 例外情况如下

还有关于SO的问题,也说这是一个UB和一个坏主意[2,3]。

我们在不支持的平台上使用 boost::tr1(例如 WinCE、WM)。Boost 正是这样做的:将自己的实现注入到 if 中。tr1std::tr1tr1

例如,在 boost/tr1/memory.hpp 中:

namespace std{ namespace tr1{ 
   using ::boost::bad_weak_ptr;
   using ::boost::shared_ptr;
   ...
} }

我的问题是:

  • 这是否意味着如果与非 tr1 编译器一起使用,它是 UB?boost::tr1

  • 或者,只要开发人员确保向后移植的功能不可用,就可以向后移植注入吗?std

  • 如果没问题,可以更进一步,注入而不是?boost::tr1stdstd::tr1

C++ 提升 std 未定义行为 tr1

评论

2赞 Bo Persson 2/8/2018
大多数 UB 来自这样一个事实,即允许实现已经向命名空间 std 添加专用化和其他重载。如果你也这样做,就会有冲突。Boost 的伎俩可能会得到编译器制造商的认可,在这种情况下,它是定义的实现而不是 UB。
1赞 Barry 2/9/2018
只。。。别这样。把东西放在命名空间或其他东西中。那么你就不必处理这些问题中的任何一个了。mystd
0赞 AMA 2/9/2018
@Barry似乎是这样。我现在倾向于解决方案std_
0赞 Luis Machuca 1/22/2019
如果这个想法是向后移植,那么我会说你根据定义算作一个实现者,因此你被隐式地允许在命名空间 std 中做这些事情;否则,这个问题是没有意义的,因为替代方案只是非功能性的向后移植:您将如何在函数签名或模板参数中编写代码,例如:使用位于其他地方的enable_if?签名中没有。这只是一个案例。至于它是否是 UB,“像编译器一样做”,你最多和他们一样多 UB。typename = std::enable_if<....>using

答: 暂无答案