智能指针投射 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]
.
获取元素
我试图在智能指针中使用数组,但是当我使用 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]
.