gpt4 book ai didi

c++ - 为什么 std::array 没有运算符 T*?

转载 作者:行者123 更新时间:2023-11-27 22:34:39 25 4
gpt4 key购买 nike

对于 C 数组,在将近 50 年的时间里,简单地命名数组与编写 &foo[0] 具有相同的效果。

在我正在处理的项目中将 C 样式数组转换为 std::array<> 时,出现的绝大多数“错误”都是由于 C 数组的上述属性造成的。

在所有情况下,解决方案都很简单,只需附加 .data()。然而我想到一个精心设计的operator T*应该可以直接解决这个问题。

是否存在无法创建此运算符的任何技术原因?

最佳答案

C 风格的数组是有大小的结构。您可以通过多种方式获取数组的编译时大小。但是,当数组衰减为指针时,您将丢失编译时大小信息。即使参数是“数组”类型,它实际上仍然只是一个没有大小信息的指针。如果数组作为函数参数 (template<size_t S> void func(T(&param)[S])) 传递,您可以使用模板编程来保留大小,但仅此而已。

许多 C++ 程序员认为数组隐式衰减为指针是 C 风格数组中的一个设计缺陷。事实上,说有损转换可能不是应该隐式的转换并不是没有道理的。鉴于 std::array试图尽可能多地修复 C 风格数组的缺陷,允许它隐式衰减为指针会适得其反。

相比之下,C++20's std::span type提供从 std::array 的隐式转换(以及 C 风格的数组等)。原因是这样的转换保留了信息:指针和大小。事实上,转换甚至可以保留该大小的编译时性质。


Is there any technical reason this operator could not be created?

不能”?没有。

关于c++ - 为什么 std::array 没有运算符 T*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56333109/

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