【发布时间】:2019-10-13 10:41:04
【问题描述】:
对于 C 数组,简单地命名一个数组与近 50 年来写 &foo[0] 的效果相同。
在我正在处理的项目中从 C 样式数组转换为 std::array 时,出现的绝大多数“错误”是由于 C 数组的上述属性造成的。
在所有情况下,解决方案都很简单,只需附加 .data()。但是我突然想到,精心设计的operator T* 应该可以直接解决这个问题。
是否有任何技术原因无法创建此运算符?
【问题讨论】:
-
我个人认为调用
.data()比使用内置数组更安全。 -
这个操作符不存在有什么好的理由吗? -- 很好 -- 另一个操作符在运行时被调用,而程序员可能不知道它。如果您注意到,大多数 C++ 标准库都远离强制转换运算符(也许所有标准库都这样做)。意识到
std::string和一般std::basic_string<>也没有operator char*(),而是提供c_str()函数。我的经验是,一个 C++ 程序员在代码库中多次使用强制转换运算符时并不知道自己调用了哪些函数。 -
@sepp2k 是的,我要找的是运营商 T*。我查看了几年前的一些代码,这些代码用于其他目的。在此期间,我的记忆消失了,我们在允许直接访问的上下文中使用
operator T。至少在大多数情况下,它确实在某种程度上依赖于编译器在运行时推断目标类型的能力。在 99% 的情况下它工作正常,而对于 1% 的情况,我们有一个.get()方法来覆盖。我已经适当地编辑了这个问题。 -
不隐式衰减到指针是使用
std::array而不是内置数组的最显着优势之一。 -
@L.F.隐式转换不是“衰减”。
标签: c++ c++11 language-lawyer implicit-conversion stdarray