Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;11?_C++_C++11_Unique Ptr_C++14 - Fatal编程技术网

C++ 如何在C++;11?

C++ 如何在C++;11?,c++,c++11,unique-ptr,c++14,C++,C++11,Unique Ptr,C++14,我的编译器不支持使_唯一。怎么写 template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args ); 模板唯一性(Args&&…Args); 斯蒂芬·拉瓦维(Stephan T.Lavavej,STL也知道)的版本,他最初提议将此函数添加到C++14中 #include <cstddef> #include <memory> #includ

我的编译器不支持使_唯一。怎么写

template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args );
模板唯一性(Args&&…Args);

斯蒂芬·拉瓦维(Stephan T.Lavavej,STL也知道)的版本,他最初提议将此函数添加到C++14中

#include <cstddef>
#include <memory>
#include <type_traits>
#include <utility>

namespace std {
    template<class T> struct _Unique_if {
        typedef unique_ptr<T> _Single_object;
    };

    template<class T> struct _Unique_if<T[]> {
        typedef unique_ptr<T[]> _Unknown_bound;
    };

    template<class T, size_t N> struct _Unique_if<T[N]> {
        typedef void _Known_bound;
    };

    template<class T, class... Args>
        typename _Unique_if<T>::_Single_object
        make_unique(Args&&... args) {
            return unique_ptr<T>(new T(std::forward<Args>(args)...));
        }

    template<class T>
        typename _Unique_if<T>::_Unknown_bound
        make_unique(size_t n) {
            typedef typename remove_extent<T>::type U;
            return unique_ptr<T>(new U[n]());
        }

    template<class T, class... Args>
        typename _Unique_if<T>::_Known_bound
        make_unique(Args&&...) = delete;
}
#包括
#包括
#包括
#包括
名称空间标准{
模板结构\u唯一\u如果{
typedef unique_ptr_Single_object;
};
模板结构\u唯一\u如果{
typedef unique_ptr_Unknown_bound;
};
模板结构\u唯一\u如果{
typedef void_Known_bound;
};
模板
typename\u唯一\u如果::\u单个\u对象
使_唯一(Args&&…Args){
返回唯一的ptr(新T(标准::转发标准修订版

复制自(中给出了相同内容)

模板
std::unique_ptr使_唯一(Args&&…Args)
{
返回std::unique_ptr(新的T(std::forward



不过,如果中的解决方案与您的编译器一起编译,我会选择该解决方案。这一解决方案更复杂,也适用于数组。

可能重复@BenJackson,目的是在正确使用
make\u unique
时,永远不会与
\u Known\u bound
版本匹配。如果有人试图将其用作<代码> MaxuUngy()/>代码>它将匹配<代码>知识No.[/COD>版本]并导致错误。什么是将这个定义包含在C++代码中的一种好方法,它最终可以在一个MaSTa独特的环境中编译,在STDC++?@和AdReSyyAkoNoLUS中,我建议,如果是,Y-CPLUS PLUS==201103L……(请参见本章末尾附近的uuu cplusplus条目)请注意,我们不允许像这样将内容放入std::中。如果我必须添加
make_unique
,我宁愿使用我自己的实用程序名称空间。你可以检查u cplusplus版本以避免问题。为什么点会超出args括号?这对我来说太违反直觉了!@Apollys如果我正确理解你的问题:那会将参数扩展到
std::forward
,而不是
T
(可能我误解了你的问题)。可能这就是我要问的,我对
语法知之甚少,只知道我在示例中看到的。我觉得奇怪的是
std::forward(args)行中的内容似乎<>代码> ARGs现在,每个参数都是单独的,而在顶部,它意味着所有的参数都是一个单元。@ AppOyyyYes,C++是一种奇怪的语言,充满了这样的怪癖。(当调用<代码> MaMaIOX < <代码> >创建一个数组类型,如<代码>无符号字符[A]时,这将不起作用。
并生成错误消息
分配不完整类型
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}