由于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产生错误,抱怨它不能std::swap
使用const char*&
和调用char*&
。reset
方法在char[]
可转换为的重载解析中进行const char[]
,但自然会std::swap
等待两个相同类型的引用。
这被认为是正确的行为吗?如果是这样,那为什么呢?如果我可以隐式转换char[]
为const char[]
,为什么不应该这样unique_ptr
?
因此,这似乎确实是gcc libstdc ++中的错误。@Barry报道:77987
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句