在gcc 6中实现std :: unique_ptr <T []> :: reset

用户名

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

这被认为是正确的行为吗?如果是这样,那为什么呢?如果我可以隐式转换char[]const char[],为什么不应该这样unique_ptr

用户名

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: unordered_map <T,std :: unique_ptr <U >>是否可复制?GCC错误?

为什么std :: unique_ptr :: reset()总是noexcept?

使用 std::unique_ptr<T>::unique_ptr` 在 Visual Studio 2013 中构建错误

使用std :: unique_ptr <T>&代替std :: unique_ptr <T>有什么优势吗?

如何初始化std :: unique_ptr <std :: unique_ptr <T> []>?

参数std :: unique_ptr <T> &&的std :: move或std :: forward

调整大小std :: vector <std :: unique_ptr <T >>的性能

为什么std :: shared_ptr <T> = std :: unique_ptr <T []>可以编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不可以编译?

std :: unique_ptr <T>而不在堆上分配内存

std :: unique_ptr可在GCC中使用,但无法在Visual Studio中编译

从工厂函数返回std :: unique_ptr <T>,创建纯虚拟接口的完全隐藏的实现

强制模板函数在类<std :: unique_ptr <B >>中为T = B *

将std :: vector <std :: unique_ptr <T >>分配给另一个std :: vector <std :: unique_ptr <T >>

来自T *的std :: unique_ptr <T>的构造函数背后的原因是什么?

为什么std :: unique_ptr不能隐式转换为T *和const T *?

是否需要std :: unique_ptr <T>知道T的完整定义?

不能使用std :: unique_ptr <T>且T为前向声明

std :: unique_ptr :: reset()が常にnoexceptであるのはなぜですか?

还有什么更好的替代std :: vector <std :: unique_ptr <T >>吗?

在std :: unordered_set <std :: unique_ptr>(C ++ 20)中找到指针T *

是否有std :: unique_ptr <std :: array <T,N >>的用例

根据对对std :: pair <int,std :: unique_ptr <const T>>的向量进行排序

为什么可以在寄存器中传递T *,但不能传递unique_ptr <T>?

如何使用std :: vector <unique_ptr <T >>作为默认参数

查看std :: unique_ptr及其nullptr_t构造函数

std :: unique_ptr <T []>和自定义分配器删除器

std :: vector <unique_ptr <class T >>的动态初始化

std :: unique_ptr <T []>具有派生对象的数组,使用已删除的函数

std :: unique_ptr <T []> API禁止派生到基址的指针转换