簡體   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