gpt4 book ai didi

c++ - std::make_array 通用类型的基本原理

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:51 27 4
gpt4 key购买 nike

std::make_array使用普通类型。但是,我的主要问题是它允许编译原本无法编译的代码:

template <typename T>
void foo(T a, T b)
{
}

int main()
{
auto arr = std::experimental::make_array(1, 3.0); // Compiles
foo(1, 3.0); // a and b types must match
std::array<int, 2> arr2{1, 3.0}; // narrowing conversion
}

这不一定是坏事。但是我觉得前后矛盾。请注意,由于模板参数推导的工作方式,std::make_array<int>实际上禁用推导(因为你明确指定了一个类型)所以这不能解决问题。

这里使用通用类型的基本原理是什么?

最佳答案

std::make_array uses the common type.

它应该使用什么其他来推断要创建的数组元素的类型?

第一个元素?如果是这样,难道不是很不一致......

auto a = make_array(1, 3.0);
auto b = make_array(3.0, 1);

...这两个数组的不同类型?

当然,可以 SFINAE 或 static_assert 传递给 std::make_array 的所有类型的参数都是相同的,但是你人为地限制了该函数的使用很多。考虑:

short x = 3;
auto c = make_array(x, 42); // Should this be a compiler error? I'd say no ...

您可以更进一步,将类型“相同”的要求放宽到(在某种意义上)兼容的类型。但是,你不是已经在 std::common_type 的一半以上了吗?

(probably) official reasoning (N3824)的目的是提供“类元组”接口(interface)和“类数组”接口(interface)。前者的作用类似于 std::make_tuplestd::make_pair 并推导出一些合适的(因此是通用的)类型,后者反射(reflect)原始数组声明,例如 ...

int arr[] = {1, 2, 3};

...它不推断元素的类型,而只推断数组长度。

关于c++ - std::make_array 通用类型的基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43421947/

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