我遇到了固定于C ++ 11功能但实现的代码库std::make_unique。namespace std如果不使用C ++ 14,则可以扩展以添加功能,即将实现包装在周围
#if defined(__cplusplus) && __cplusplus < 201402L
namespace std {
...
}
#endif
Run Code Online (Sandbox Code Playgroud)
我知道这是要扩展的未定义行为namespace std(有一些例外)。上面的情况是否仍然可以接受,还是应该避免?
不,这是禁止的-即使通过
#define make_unique ? ? ?
Run Code Online (Sandbox Code Playgroud)
符合标准的C ++ 11程序可以确定该库从不提及名称(在字符串化之外),因此将无法检测到该扩展名。
在这种情况下,我采用的方法略有不同:
#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编译器,它将使用编译器提供的实现。