【发布时间】:2017-10-24 08:31:45
【问题描述】:
我最近从 Microsoft 编译器切换到 GCC。在许多事情中,我注意到std::make_unique 变得不可用。这显然是因为make_unique 不是 C++11 标准的一部分,而微软只是碰巧将它作为扩展包含进来。
我们计划很快迁移到 C++14,但与此同时,我编写了这个“shim”函数,并将其放入 std。
namespace std
{
template<typename T, typename... TArgs>
unique_ptr<T> make_unique(TArgs&&... args)
{
return std::unique_ptr<T>(new T(std::forward<TArgs>(args)...));
}
}
这解决了 gcc 上的问题。但是,我想这会给微软带来问题,因为它是一个重复的定义。
有没有办法将功能正确地填充到 std 中,这样就不会在不同的编译器/C++ 标准上造成麻烦?我环顾四周,没有想出任何东西。我想可能是针对特定标准功能的包含守卫?
#ifndef MAKE_UNIQUE_DEFINED
#define MAKE_UNIQUE_DEFINED
// Define make_unique
#endif
可悲的是,std 似乎没有为特定功能定义包含防护。我还能做些什么来使它更正确并且与编译器/c++ 标准无关?
【问题讨论】:
-
从技术上讲,§17.4.3.1 使得除了模板特化之外,无法将功能可移植地插入到
std命名空间中 -
在“理论”中,我希望根据标准这是不允许的,请参阅stackoverflow.com/a/41062439/417197 或en.cppreference.com/w/cpp/language/extending_std。当然,在实践中,它会工作得很好。
-
您使用的 MSVC 版本可能已经默认支持 C++14 功能。如果您使用的是新的 MSVC 版本,您可以明确指定您想要的 C++ 版本(从 14 开始)。