8

unique_ptr<T[]>::reset由于 C++ 中的 GCC 6,方法(不是仅接受的方法)的声明/定义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。根据该文件:

此函数的行为与主模板的重置成员相同,除了它不应参与重载决议,除非

U与 的类型相同pointer,或

pointer与 的类型相同element_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*&and调用char*&reset方法发生在char[]可转换为的重载决议中const char[],但自然会std::swap等待相同类型的两个引用。

这被认为是正确的行为吗?如果是这样,那为什么?如果我可以隐式转换char[]const char[],为什么不能使用unique_ptr

4

1 回答 1

0

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

于 2016-10-15T06:32:58.253 回答