C++ int、int*和int[]与std::unique_ptr之间的差异

C++ int、int*和int[]与std::unique_ptr之间的差异,c++,pointers,c++11,unique-ptr,C++,Pointers,C++11,Unique Ptr,由于您可以执行std::unique\u ptr upi{new int},我立即感到困惑,为什么std::unique\u ptr upi{new int[42]{}不起作用。有人能解释一下以下片段之间的区别吗 { std::unique_ptr<int> upi{new int[42]{}}; upi.get()[0]; } // Doesn't work { std::unique_ptr<int> upi{new int[42]{}};

由于您可以执行
std::unique\u ptr upi{new int}
,我立即感到困惑,为什么
std::unique\u ptr upi{new int[42]{}
不起作用。有人能解释一下以下片段之间的区别吗

{
    std::unique_ptr<int> upi{new int[42]{}};
    upi.get()[0];
}

// Doesn't work
{
    std::unique_ptr<int> upi{new int[42]{}};
    upi[0];
}

{
    std::unique_ptr<int[]> upi{new int[42]{}};
    upi.get()[0];
}    

{
    std::unique_ptr<int[]> upi{new int[42]{}};
    upi[0];
}     

// Doesn't work
{
    std::unique_ptr<int*> upi{new int[42]{}};
    upi.get()[0];
}      

// Doesn't work    
{
    std::unique_ptr<int*> upi{new int[42]{}};
    upi[0];
}
{
std::unique_ptr upi{new int[42]{};
upi.get()[0];
}
//不起作用
{
std::unique_ptr upi{new int[42]{};
upi[0];
}
{
std::unique_ptr upi{new int[42]{};
upi.get()[0];
}    
{
std::unique_ptr upi{new int[42]{};
upi[0];
}     
//不起作用
{
std::unique_ptr upi{new int[42]{};
upi.get()[0];
}      
//不起作用
{
std::unique_ptr upi{new int[42]{};
upi[0];
}
编译器错误:

prog.cpp: In function ‘int main()’:
prog.cpp:8:20: warning: value computed is not used [-Wunused-value]
         upi.get()[0];
                    ^
prog.cpp:14:12: error: no match for ‘operator[]’ (operand types are ‘std::unique_ptr<int>’ and ‘int’)
         upi[0];
            ^
prog.cpp:19:20: warning: value computed is not used [-Wunused-value]
         upi.get()[0];
                    ^
prog.cpp:29:48: error: no matching function for call to ‘std::unique_ptr<int*>::unique_ptr(<brace-enclosed initializer list>)’
         std::unique_ptr<int*> upi{new int[42]{}};
                                                ^
prog.cpp:29:48: note: candidates are:
In file included from /usr/include/c++/4.8/memory:81:0,
                 from prog.cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:176:2: note: template<class _Up, class> std::unique_ptr<_Tp, _Dp>::unique_ptr(std::auto_ptr<_Up>&&)
  unique_ptr(auto_ptr<_Up>&& __u) noexcept;
  ^
/usr/include/c++/4.8/bits/unique_ptr.h:176:2: note:   template argument deduction/substitution failed:
prog.cpp:29:48: note:   mismatched types ‘std::auto_ptr<_Up>’ and ‘int*’
         std::unique_ptr<int*> upi{new int[42]{}};
                                                ^
In file included from /usr/include/c++/4.8/memory:81:0,
                 from prog.cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:169:2: note: template<class _Up, class _Ep, class> std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Up, _Ep>&&)
  unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept
  ^
/usr/include/c++/4.8/bits/unique_ptr.h:169:2: note:   template argument deduction/substitution failed:
prog.cpp:29:48: note:   mismatched types ‘std::unique_ptr<_Tp, _Dp>’ and ‘int*’
         std::unique_ptr<int*> upi{new int[42]{}};
                                                ^
In file included from /usr/include/c++/4.8/memory:81:0,
                 from prog.cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:160:7: note: std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Tp, _Dp>&&) [with _Tp = int*; _Dp = std::default_delete<int*>]
       unique_ptr(unique_ptr&& __u) noexcept
       ^
/usr/include/c++/4.8/bits/unique_ptr.h:160:7: note:   no known conversion for argument 1 from ‘int*’ to ‘std::unique_ptr<int*>&&’
/usr/include/c++/4.8/bits/unique_ptr.h:157:17: note: constexpr std::unique_ptr<_Tp, _Dp>::unique_ptr(std::nullptr_t) [with _Tp = int*; _Dp = std::default_delete<int*>; std::nullptr_t = std::nullptr_t]
       constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { }
                 ^
/usr/include/c++/4.8/bits/unique_ptr.h:157:17: note:   no known conversion for argument 1 from ‘int*’ to ‘std::nullptr_t’
/usr/include/c++/4.8/bits/unique_ptr.h:151:7: note: std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Tp, _Dp>::pointer, typename std::remove_reference<_To>::type&&) [with _Tp = int*; _Dp = std::default_delete<int*>; std::unique_ptr<_Tp, _Dp>::pointer = int**; typename std::remove_reference<_To>::type = std::default_delete<int*>]
       unique_ptr(pointer __p,
       ^
/usr/include/c++/4.8/bits/unique_ptr.h:151:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/4.8/bits/unique_ptr.h:146:7: note: std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Tp, _Dp>::pointer, typename std::conditional<std::is_reference<_Dp>::value, _Dp, const _Dp&>::type) [with _Tp = int*; _Dp = std::default_delete<int*>; std::unique_ptr<_Tp, _Dp>::pointer = int**; typename std::conditional<std::is_reference<_Dp>::value, _Dp, const _Dp&>::type = const std::default_delete<int*>&]
       unique_ptr(pointer __p,
       ^
/usr/include/c++/4.8/bits/unique_ptr.h:146:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/4.8/bits/unique_ptr.h:141:7: note: std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Tp, _Dp>::pointer) [with _Tp = int*; _Dp = std::default_delete<int*>; std::unique_ptr<_Tp, _Dp>::pointer = int**]
       unique_ptr(pointer __p) noexcept
       ^
/usr/include/c++/4.8/bits/unique_ptr.h:141:7: note:   no known conversion for argument 1 from ‘int*’ to ‘std::unique_ptr<int*>::pointer {aka int**}’
/usr/include/c++/4.8/bits/unique_ptr.h:135:17: note: constexpr std::unique_ptr<_Tp, _Dp>::unique_ptr() [with _Tp = int*; _Dp = std::default_delete<int*>]
       constexpr unique_ptr() noexcept
                 ^
/usr/include/c++/4.8/bits/unique_ptr.h:135:17: note:   candidate expects 0 arguments, 1 provided
prog.cpp:30:20: warning: value computed is not used [-Wunused-value]
         upi.get()[0];
                    ^
prog.cpp:35:48: error: no matching function for call to ‘std::unique_ptr<int*>::unique_ptr(<brace-enclosed initializer list>)’
         std::unique_ptr<int*> upi{new int[42]{}};
                                                ^
prog.cpp:35:48: note: candidates are:
In file included from /usr/include/c++/4.8/memory:81:0,
                 from prog.cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:176:2: note: template<class _Up, class> std::unique_ptr<_Tp, _Dp>::unique_ptr(std::auto_ptr<_Up>&&)
  unique_ptr(auto_ptr<_Up>&& __u) noexcept;
  ^
/usr/include/c++/4.8/bits/unique_ptr.h:176:2: note:   template argument deduction/substitution failed:
prog.cpp:35:48: note:   mismatched types ‘std::auto_ptr<_Up>’ and ‘int*’
         std::unique_ptr<int*> upi{new int[42]{}};
                                                ^
In file included from /usr/include/c++/4.8/memory:81:0,
                 from prog.cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:169:2: note: template<class _Up, class _Ep, class> std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Up, _Ep>&&)
  unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept
  ^
/usr/include/c++/4.8/bits/unique_ptr.h:169:2: note:   template argument deduction/substitution failed:
prog.cpp:35:48: note:   mismatched types ‘std::unique_ptr<_Tp, _Dp>’ and ‘int*’
         std::unique_ptr<int*> upi{new int[42]{}};
                                                ^
In file included from /usr/include/c++/4.8/memory:81:0,
                 from prog.cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:160:7: note: std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Tp, _Dp>&&) [with _Tp = int*; _Dp = std::default_delete<int*>]
       unique_ptr(unique_ptr&& __u) noexcept
       ^
/usr/include/c++/4.8/bits/unique_ptr.h:160:7: note:   no known conversion for argument 1 from ‘int*’ to ‘std::unique_ptr<int*>&&’
/usr/include/c++/4.8/bits/unique_ptr.h:157:17: note: constexpr std::unique_ptr<_Tp, _Dp>::unique_ptr(std::nullptr_t) [with _Tp = int*; _Dp = std::default_delete<int*>; std::nullptr_t = std::nullptr_t]
       constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { }
                 ^
/usr/include/c++/4.8/bits/unique_ptr.h:157:17: note:   no known conversion for argument 1 from ‘int*’ to ‘std::nullptr_t’
/usr/include/c++/4.8/bits/unique_ptr.h:151:7: note: std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Tp, _Dp>::pointer, typename std::remove_reference<_To>::type&&) [with _Tp = int*; _Dp = std::default_delete<int*>; std::unique_ptr<_Tp, _Dp>::pointer = int**; typename std::remove_reference<_To>::type = std::default_delete<int*>]
       unique_ptr(pointer __p,
       ^
/usr/include/c++/4.8/bits/unique_ptr.h:151:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/4.8/bits/unique_ptr.h:146:7: note: std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Tp, _Dp>::pointer, typename std::conditional<std::is_reference<_Dp>::value, _Dp, const _Dp&>::type) [with _Tp = int*; _Dp = std::default_delete<int*>; std::unique_ptr<_Tp, _Dp>::pointer = int**; typename std::conditional<std::is_reference<_Dp>::value, _Dp, const _Dp&>::type = const std::default_delete<int*>&]
       unique_ptr(pointer __p,
       ^
/usr/include/c++/4.8/bits/unique_ptr.h:146:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/4.8/bits/unique_ptr.h:141:7: note: std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Tp, _Dp>::pointer) [with _Tp = int*; _Dp = std::default_delete<int*>; std::unique_ptr<_Tp, _Dp>::pointer = int**]
       unique_ptr(pointer __p) noexcept
       ^
/usr/include/c++/4.8/bits/unique_ptr.h:141:7: note:   no known conversion for argument 1 from ‘int*’ to ‘std::unique_ptr<int*>::pointer {aka int**}’
/usr/include/c++/4.8/bits/unique_ptr.h:135:17: note: constexpr std::unique_ptr<_Tp, _Dp>::unique_ptr() [with _Tp = int*; _Dp = std::default_delete<int*>]
       constexpr unique_ptr() noexcept
                 ^
/usr/include/c++/4.8/bits/unique_ptr.h:135:17: note:   candidate expects 0 arguments, 1 provided
prog.cpp:36:12: error: no match for ‘operator[]’ (operand types are ‘std::unique_ptr<int*>’ and ‘int’)
         upi[0];
            ^
prog.cpp:在函数“int main()”中:
程序cpp:8:20:警告:未使用计算的值[-Wunused value]
upi.get()[0];
^
程序cpp:14:12:错误:“运算符[]”不匹配(操作数类型为“std::unique_ptr”和“int”)
upi[0];
^
程序cpp:19:20:警告:未使用计算的值[-Wunused value]
upi.get()[0];
^
prog.cpp:29:48:错误:调用“std::unique\u ptr::unique\u ptr()”时没有匹配的函数
std::unique_ptr upi{new int[42]{};
^
项目cpp:29:48:注:候选人为:
在/usr/include/c++/4.8/memory:81:0中包含的文件中,
来自项目cpp:2:
/usr/include/c++/4.8/bits/unique\u ptr.h:176:2:注:模板std::unique\u ptr::unique\u ptr(std::auto\u ptr&)
唯一(自动)无例外;
^
/usr/include/c++/4.8/bits/unique_ptr.h:176:2:注意:模板参数推导/替换失败:
程序cpp:29:48:注意:类型“std::auto_ptr”和“int*”不匹配
std::unique_ptr upi{new int[42]{};
^
在/usr/include/c++/4.8/memory:81:0中包含的文件中,
来自项目cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:169:2:注:模板std::unique_ptr::unique_ptr(std::unique_ptr&)
唯一的(唯一的)无例外
^
/usr/include/c++/4.8/bits/unique_ptr.h:169:2:注意:模板参数推导/替换失败:
程序cpp:29:48:注意:类型“std::unique_ptr”和“int*”不匹配
std::unique_ptr upi{new int[42]{};
^
在/usr/include/c++/4.8/memory:81:0中包含的文件中,
来自项目cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:160:7:注:std::unique_ptr::unique_ptr(std::unique_ptr&)[with _Tp=int*;_Dp=std::default_delete]
唯一的(唯一的)无例外
^
/usr/include/c++/4.8/bits/unique\u ptr.h:160:7:注意:参数1从“int*”到“std::unique\u ptr&”的转换未知
/usr/include/c++/4.8/bits/unique_ptr.h:157:17:注:constepr std::unique_ptr::unique_ptr(std::nullptr_t)[带_Tp=int*;_Dp=std::default_delete;std::nullptr_t=std::nullptr_t]
constexpr unique_ptr(nullptr_t)noexcept:unique_ptr(){}
^
/usr/include/c++/4.8/bits/unique_ptr.h:157:17:注意:参数1从“int*”到“std::nullptr_t”的转换未知
/usr/include/c++/4.8/bits/unique\u ptr.h:151:7:注:std::unique\u ptr::unique\u ptr::pointer,typename std::remove\u reference::type&)[with _Tp=int*;_Dp=std::default\u delete;std::unique\u ptr::pointer=int**;typename std::remove\u reference::type=std::default\u delete]
唯一指针,
^
/usr/include/c++/4.8/bits/unique\u ptr.h:151:7:注意:候选者需要2个参数,提供1个
/usr/include/c++/4.8/bits/unique\u ptr.h:146:7:注:std::unique\u ptr::unique\u ptr::unique\u ptr::pointer,typename std::conditional::type)[withTp=int*;Dp=std::default\u delete;std::unique\u ptr::pointer=int**;typename std::const::std::default delete&]
唯一指针,
^
/usr/include/c++/4.8/bits/unique\u ptr.h:146:7:注意:候选者需要2个参数,提供1个
/usr/include/c++/4.8/bits/unique\u ptr.h:141:7:注:std::unique\u ptr::unique\u ptr::pointer[带_Tp=int*;_Dp=std::default\u delete;std::unique\u ptr::pointer=int**]
唯一\u ptr(指针\u p)无异常
^
/usr/include/c++/4.8/bits/unique\u ptr.h:141:7:注意:参数1从'int*'到'std::unique\u ptr::pointer{aka int**}的转换未知
/usr/include/c++/4.8/bits/unique_ptr.h:135:17:注:constepr std::unique_ptr::unique_ptr()[带_Tp=int*;_Dp=std::default_delete]
constexpr unique_ptr()noexcept
^
/usr/include/c++/4.8/bits/unique\u ptr.h:135:17:注意:候选者需要0个参数,提供1个参数
程序cpp:30:20:警告:未使用计算的值[-Wunused value]
upi.get()[0];
^
prog.cpp:35:48:错误:调用“std::unique\u ptr::unique\u ptr()”时没有匹配的函数
std::unique_ptr upi{new int[42]{};
^
项目cpp:35:48:注:候选人为:
在/usr/include/c++/4.8/memory:81:0中包含的文件中,
来自项目cpp:2:
/usr/include/c++/4.8/bits/unique\u ptr.h:176:2:注:模板std::unique\u ptr::unique\u ptr(std::auto\u ptr&)
唯一(自动)无例外;
^
/usr/include/c++/4.8/bits/unique_ptr.h:176:2:注意:模板参数推导/替换失败:
程序cpp:35:48:注意:类型“std::auto_ptr”和“int*”不匹配
std::unique_ptr upi{new int[42]{};
^
在/usr/include/c++/4.8/memory:81:0中包含的文件中,
来自项目cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:169:2:注:模板std::unique_ptr::unique_ptr(std::unique_ptr&)
唯一的(唯一的)无例外
^
/usr/include/c++/4.8/bits/unique_ptr.h:169:2:注意:模板参数推导/替换失败:
程序cpp:35:48:注:类型不匹配
 std::unique_ptr<int> upi{new int[42]{}};
upi[0];
std::unique_ptr<int*> upi{new int[42]{}};
std::unique_ptr<int[]> upi{new int[42]{}};
upi.get()[0] = 0;  // this works
upi[0] = 0;        // and so does this