gpt4 book ai didi

c++ - 为什么 `std::experimental::make_array` 不能使用 `std::reference_wrapper` ?

转载 作者:行者123 更新时间:2023-12-05 04:29:31 33 4
gpt4 key购买 nike

template <class D, class...> 
struct return_type_helper
{
using type = D;
};

template <class... Types>
struct return_type_helper<void, Types...> : std::common_type<Types...>
{
static_assert(
// why can't I use reference wrappers?
std::conjunction_v<not_ref_wrapper<Types>...>,
"Types cannot contain reference_wrappers when D is void"
);
};

template <class D = void, class... Types>
constexpr std::array<typename return_type_helper<D, Types...>::type, sizeof...(Types)> make_array(Types&&... t)
{
return {std::forward<Types>(t)...};
}

void foo()
{
int x = 7355608;
auto arr = make_array(std::ref(x)); // does not compile
}

为什么 std::experimental::make_array() 有一个 static_assert() 不允许使用 std::reference_wrapper数组的类型是自动推导出来的?创建引用包装器数组在其他方面是完全合法的,也就是说编译器没有问题

auto arr2 = std::array<decltype(std::ref(x)),1>{std::ref(x)};

最佳答案

检查提案 N3824证实了我最初的怀疑。

static_assert添加检查以明确禁止 std::array<std::reference_wrapper<T>, N> 的类型推导来自 make_array ,因为提案的作者认为这种用法容易出错。1

也就是用下面的代码:

auto x = 42;
auto a = make_array(std::ref(x));

用户可以合理地期望 a 的类型成为std::array<int&, 1> ,因为 std::ref在其他情况下表现相似。

现实std::array<int&, 1>没有命名有效类型并且不能被构造,所以这种混淆的危险是最小的。不过,作者发现在这里谨慎行事并使 API 具有最大防御性是值得的。

因此,如果用户想要创建一个引用包装器数组,他们需要明确请求该类型:

auto a = make_array<std::reference_wrapper<int>>(std::ref(x));

1 这是提案的措辞:

Ban reference_wrapper in the make_tuple-like interface. make_tuple and make_pair have special handling of reference_wrapper, then user might expect that the expression

make_array(ref(a), ref(b))

also results in a tuple-like object storing T&.

关于c++ - 为什么 `std::experimental::make_array` 不能使用 `std::reference_wrapper` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72319915/

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