智能指针投射 c++17 apple clang

Smart pointers cast c++17 apple clang

我试图在智能指针中使用数组,但是当我使用 Apple clang 将 smart_ptr 转换为 weak_ptr 时出现错误(我使用 -std=c++17)。

error: cannot initialize a member subobject of type 'std::weak_ptr<int []>::element_type *' (aka 'int (*)[]') with an lvalue of type 'std::shared_ptr<int []>::element_type *const' (aka 'int *const')
    : __ptr_(__r.__ptr_),

这是我正在尝试编译的代码示例。

std::shared_ptr<int[]> ptr(new int[5]);
ptr[0] = 1;
ptr[1] = 2;
ptr[2] = 3;

std::weak_ptr<int[]> weakPtr(ptr);

std::cout << ptr[0] << std::endl;

P.S。我无法使用 std::array,因为我正在实现自己的容器 class。

这似乎是一个错误,其中 weak_ptr<T>::element_type 应该定义为 remove_extend_t<T>,但当前定义为 T。另一方面,share_ptr<T>::element_type 被正确定义为 remove_extend_t<T>.

这种不一致导致shared_ptr<T[]>的底层类型是T*,而weak_ptr<T[]>的底层类型是T(*)[],所以不能给[=15=赋值] 达到预期的 weak_ptr<T[]>

错误已在此提交中修复:LWG3001 应该包含在未来的版本中。


解决方法是可能使用 shared_ptr<std::array<int, 5>> 并使用 weak_ptr weakPtr(ptr).

推断 std::weak_ptr 的类型

请注意,您将无法再直接使用 shared_ptr::operator []。相反,您需要使用 (*ptr)[N].

获取元素