使用C ++ 11时扩展名称空间标准以实现make_unique

Bep*_*oso 7 c++ c++11 c++14

我遇到了固定于C ++ 11功能但实现的代码库std::make_uniquenamespace std如果不使用C ++ 14,则可以扩展以添加功能,即将实现包装在周围

#if defined(__cplusplus) && __cplusplus < 201402L

namespace std {
  ...
}

#endif
Run Code Online (Sandbox Code Playgroud)

我知道这是要扩展的未​​定义行为namespace std(有一些例外)。上面的情况是否仍然可以接受,还是应该避免?

Dav*_*ing 7

不,这是禁止的-即使通过

#define make_unique ? ? ?
Run Code Online (Sandbox Code Playgroud)

符合标准的C ++ 11程序可以确定该库从不提及名称(在字符串化之外),因此将无法检测到该扩展名。


Jer*_*fin 5

在这种情况下,我采用的方法略有不同:

#if __cplusplus < 201402L

namespace std14 {
  ...
}

#else
     using namespace std14 = std;
#endif
Run Code Online (Sandbox Code Playgroud)

然后,您将代码编写为:

auto foo = std14::make_unique<T>(whatever);
Run Code Online (Sandbox Code Playgroud)

...目前,它将使用的实现make_unique,但是当/如果您开始使用C ++ 14编译器,它将使用编译器提供的实现。