繁体   English   中英

std :: unique_ptr的实现 <T[]> ::在GCC 6中重置

[英]Implementation of std::unique_ptr<T[]>::reset in gcc 6

由于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,对此进行了某些更改。 根据该文件:

此函数的行为与主模板的reset成员相同,不同之处在于,除非该函数不参与任何重载解析,否则

Upointer具有相同的类型,或者

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产生错误,因此抱怨它无法使用const char*&char*&调用std::swap reset方法在重载解析中发生,因为char[]可转换为const char[] ,但自然std::swap等待两个相同类型的引用。

这被认为是正确的行为吗? 如果是这样,那为什么呢? 如果我可以将char[]隐式转换为const char[] ,为什么对unique_ptr不能做到相同?

因此,这似乎确实是gcc libstdc ++中的错误。 @Barry报道: 77987

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM