gpt4 book ai didi

c++ - 数组指针何时可转换为不同类型的数组指针?

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:03 24 4
gpt4 key购买 nike

我正在检查 cppreference documentation对于 std::unique_ptr并注意到 C++17 似乎做了一些有趣的改变。特别是 std::unique_ptr<T[]> 的特化现在接受模板参数,以前只接受 std::unique_ptr::pointer争论。例如,这是 reset 之一的声明std::unique_ptr<T[]> 的成员函数:

template <typename U> void reset(U p);

网站声明:

Behaves the same as the reset member of the primary template, except that it will only participate in overload resolution if either U is the same type as pointer, or pointer is the same type as element_type* and U is a pointer type V* such that V(*)[] is convertible to element_type(*)[].

我假设这样做是为了安全 - 你不会想执行 delete[]在指向派生类型数组的指针上,该数组分配给指向其基类型的指针(在 C++17 之前,这被标记为已删除)。正如预期的那样,这段代码编译得很好:

#include <type_traits>

struct foo {};
struct bar : public foo {};
static_assert(!std::is_convertible_v<bar(*)[], foo(*)[]>);

然而,有趣的是,下面的代码编译,两个都失败了 static_assert小号:

#include <type_traits>

struct foo {};
struct bar : public foo {};
static_assert(std::is_convertible_v<bar*(*)[], foo*(*)[]>);
static_assert(std::is_convertible_v<std::unique_ptr<bar>(*)[], std::unique_ptr<foo>(*)[]>);

这是为什么呢?这个重载会在什么场景下使用?

最佳答案

这基本上是一种说法“如果这样做是安全的,你可以传递一个 less const-y 指针”,例如 int* p = /*...*/; unique_ptr<const int []> up; up.reset(p);

对于不同的类型UV , 唯一的情况 U(*)[]可以(隐含地)转换为 V(*)[]qualification conversion ,即当您添加 const 时/volatile在类型的正确位置。确切的规则很复杂(因为它们处理任意嵌套的指针/指向成员的指针/数组;如果您想知道,请单击链接),但它们基本上只在安全时才允许转换; unique_ptr的规范然后利用这一事实,这样它就不必重新定义“安全”,但代价是使意图变得更加神秘。

关于c++ - 数组指针何时可转换为不同类型的数组指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42992663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com