在gcc 6中实现std :: unique_ptr <t []> :: reset

时间:2016-10-14 16:46:54

标签: c++ c++11 gcc unique-ptr gcc6

自C ++中的GCC 6以来,unique_ptr<T[]>::reset方法的声明/定义(不是仅接受nullptr_t的方法)如下所示:

template <typename _Up,
            typename = _Require<
              __or_<is_same<_Up, pointer>,
                    __and_<is_same<pointer, element_type*>,
                           is_pointer<_Up>,
                           is_convertible<
                             typename remove_pointer<_Up>::type(*)[],
                             element_type(*)[]
                           >
                    >
              >
           >>
  void
  reset(_Up __p) noexcept
  {
using std::swap;
swap(std::get<0>(_M_t), __p);
if (__p != nullptr)
  get_deleter()(__p);
  }

在某些时候改变了这一点以实现N4089。根据该文件:

  

此函数的行为与主模板的重置成员相同,但它除外   除非

,否则不得参与重载决议      

- Upointer

的类型相同      

- pointerelement_type*的类型相同,U是指针类型V*V(*)[]可转换为element_type(*)[]

让我们考虑以下示例:

std::unique_ptr<const char []> ptr1;
std::unique_ptr<char []> ptr2(new char[5]);
ptr1 = std::move(ptr2);

由于版本6 GCC产生错误,因此抱怨它无法使用std::swapconst char*&来呼叫char*&reset方法在重载决策中发生,char[]可转换为const char[],但自然std::swap等待两个相同类型的引用。

这被认为是正确的行为吗?如果是这样,为什么呢?如果我可以隐式地将char[]转换为const char[],为什么unique_ptr无法实现相同的目标?

1 个答案:

答案 0 :(得分:0)

所以这似乎是gcc libstdc ++中的一个错误。 @Barry报告了它:77987