【问题标题】:Implementation of std::unique_ptr<T[]>::reset in gcc 6在 gcc 6 中实现 std::unique_ptr<T[]>::reset
【发布时间】:2017-02-24 04:25:04
【问题描述】:

由于 C++ 中的 GCC 6,unique_ptr&lt;T[]&gt;::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,它在某个时候进行了更改。根据该文件:

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

——Upointer 的类型相同,或者

——pointerelement_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*&amp;char*&amp; 调用std::swapreset 方法发生在重载决议中,因为char[] 可以转换为const char[],但自然std::swap 等待两个相同类型的引用。

这是否被认为是正确的行为?如果是这样,那为什么?如果我可以将char[] 隐式转换为const char[],为什么unique_ptr 不能实现相同的功能?

【问题讨论】:

  • 看起来像一个 gcc 错误,提交 77987
  • 看起来Jon Wakely 已经在修复它了。
  • 太好了!所以这确实是一个错误。感谢@Barry 归档。我要结束这个问题了。

标签: c++ c++11 gcc unique-ptr gcc6


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2019-11-07
    • 2020-04-17
    • 2015-10-11
    • 2015-04-14
    • 2018-02-02
    相关资源
    最近更新 更多