gpt4 book ai didi

c++ - std::make_array 来自 signed int

转载 作者:行者123 更新时间:2023-11-30 02:27:24 27 4
gpt4 key购买 nike

给定一个代码:

constexpr auto a = std::make_array<size_t>(1, 2, 3);

Clang (3.7) 具有从 GCC 的 libstdc++v3 experimental/array 复制的实现发出此警告:

error: non-constant-expression cannot be narrowed from type 'int' to 'value_type' (aka 'unsigned long') in initializer list [-Wc++11-narrowing]
return {{ std::forward<Types>(t)... }};

当编译器在编译时知道 1、2 和 3 可以隐式转换为 size_t 时,这是否合法?

当我写的时候它没有给出警告:

constexpr std::array<size_t, 3> a{1, 2, 3};

并且 std::make_array 应该与此构造相同。

这是一个比实际问题更理论化的问题。

奖励问题:如何在 GCC 的实现中更正 std::make_array 以接受上面给出的代码?

GCC 的实现:

template <typename _Dest = void, typename... _Types>
constexpr auto
make_array(_Types&&... __t)
-> array<conditional_t<is_void_v<_Dest>,
common_type_t<_Types...>,
_Dest>,
sizeof...(_Types)>
{
static_assert(__or_<
__not_<is_void<_Dest>>,
__and_<__not_<__is_reference_wrapper<decay_t<_Types>>>...>>
::value,
"make_array cannot be used without an explicit target type "
"if any of the types given is a reference_wrapper");
return {{forward<_Types>(__t)...}};
}

最佳答案

不,std::make_array不应该与该结构相同。

std::make_array需要 Types&&... ,这需要根据参数确定类型,并且在您的情况下会生成 int 类型的参数.里面make_array ,你不再有常量值,所以范围内常量整数值可以在 {} 内部转换的异常(exception)情况不再适用。

另一个例子是 std::array<void*, 1>{0}std::make_array<void*>(0) .前者有效,因为 0可转换为任何指针类型。后者无效,因为整数参数恰好具有值 0不能隐式转换为任何指针类型。

关于c++ - std::make_array<size_t> 来自 signed int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41795478/

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