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

dgn*_*uff 0 c++ language-lawyer implicit-conversion c++11 stdarray

对于C数组,通常情况下,简单地命名数组与编写&foo[0]将近50年的东西具有相同的效果。

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

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

有任何技术原因无法创建此运算符?

Nic*_*las 5

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

许多C ++程序员认为数组到指针的隐式衰减是C样式数组中的设计缺陷。确实,有损转换很可能不是应该隐含的转换,这并非不合理。鉴于std::array试图修复尽可能多的C样式数组的缺陷,使其隐式衰减为指针将产生反效果。

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


有任何技术原因无法创建此运算符?

莫非不是”?没有。