gpt4 book ai didi

c++ - 无法应用数组 unique_ptr 的 to_address

转载 作者:行者123 更新时间:2023-12-02 09:52:41 25 4
gpt4 key购买 nike

在这个 MCVE 中:

#include <memory>

int main()
{
std::unique_ptr<char[]> myChars = std::make_unique<char[]>(20);

const char* cs = to_address (myChars);

return 0;
}
g++ 无法处理应用 to_addressmyChars -- 它提示 unique_ptr<char[]>没有名为 -> 的成员.我正在使用 g++10,但是 to_address从 g++8 开始支持。我是否在滥用它,或者这应该有效吗?

最佳答案

std::to_address()将类指针类型(如智能指针)转换为原始指针。默认情况下,对于类指针类型,std::to_address()使用类型的 operator->获取类型所持有的原始指针。但是,unique_ptr 的数组特化没有operator-> ,因此您看到的错误。to_address()还接受原始指针并按原样返回。您可以使用 unique_ptr::get()获取原始指针的方法,例如:

const char* cs = to_address(myChars.get());
在这种情况下,使用 to_address()是多余的,可以省略:
const char* cs = myChars.get();
否则,您可以提供自己的专业 to_address()对于 unique_ptr<T[]> ,例如:
template< class T >
constexpr auto to_address(const std::unique_ptr<T[]> &p) noexcept
{
return p.get();
}

...

auto myChars = std::make_unique<char[]>(20);
const char* cs = to_address(myChars);
或者更好的是,提供 std::pointer_traits 的特化对于 unique_ptr<T[]> , 其中 std::to_address()然后可以使用,例如:
template<class T>
struct pointer_traits<std::unique_ptr<T[]>>
{
using pointer = std::unique_ptr<T[]>;
using element_type = pointer::element_type;
using difference_type = std::ptrdiff_t;

static element_type* to_address(const pointer &p) noexcept
{
return p.get();
}
};

...

auto myChars = std::make_unique<char[]>(20);
const char* cs = std::to_address(myChars);

关于c++ - 无法应用数组 unique_ptr 的 to_address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63178987/

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