[英]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成員相同,不同之處在於,除非該函數不參與任何重載解析,否則
—
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產生錯誤,因此抱怨它無法使用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.