某些背景:
扩展namespace std
是未定义的行为(UB),除非它是模板专门化[1]:
添加声明或定义是未定义的行为 namespace std或嵌套在std中的任何命名空间,只有几个 以下例外情况
还有关于SO的问题,也说这是一个UB,一个坏主意[2,3]。
我们在没有tr1
支持的平台上使用boost::tr1
(例如,WinCE,WM)。 Boost正是如此:如果未提供std::tr1
,则将自己的实现注入tr1
。
namespace std{ namespace tr1{
using ::boost::bad_weak_ptr;
using ::boost::shared_ptr;
...
} }
我的问题是:
如果boost::tr1
与非tr1编译器一起使用,这是否意味着它是UB?
或者,只要开发人员确保向后移植的功能不可用,是否可以将后端注入std
?
如果可以的话,可以更进一步,将boost::tr1
注入std
而不是std::tr1
吗?