为什么当"运算符双倍*"似乎可以完成工作时需要"运算符[]"
Why is `operator[]' needed when 'operator double*` seems to do the job
operator[]
似乎是多余的,因为operator double*
似乎足够了。
这是我的代码:
struct CStandardData
{
inline operator double* () { return m_standardData; }
//inline double& operator [] (size_t ix) { return m_standardData[ix]; }
size_t m_standardDataRefCnt{ 0 };
double m_standardData[1];
} sd;
我在各种不同情况下使用sd
,包括double *a = sd
,sd[x] = 5.0
,sd[x] >= sd[y]
等。不管我是否已评论或定义了operator []
,代码似乎都可以正常工作。
在哪种情况下,有operator []
?
我可能应该添加一些上下文:
我使用了内部数据double sd[]
,该数据在大量的代码> 5000行中进行了动态分配。然后,我需要将分配参考计数添加到此双重数组中,因为需要复制其所在的对象,然后将副本传递给用户(double sd[]
为> 10000个元素,因此我不希望制作额外的副本(。这是我为此而设计的计划,而无需使用它修改代码的庞大基础,但是不确定省略operator []
是否会导致任何问题。
在哪种情况下,必须拥有操作员[]?
在您希望对象充当容器而不是指针的情况下。例如,此代码:
MyContainer cnt;
if( cnt ) // something
如果您定义了operator double *
,则会编译,但我不希望该代码一般为我的容器编译,因为它没有任何意义。
sd[x] = 5.0
在调用 operator []
之前,编译器没有上下文来应用CStandardData
的隐式用户定义转换为double *
。如果明确执行此类转换,则无需过载operator []
:static_cast<double *>(sd)[x]
也要超载operator []
似乎是一个好主意,因为它可以验证通过的索引有效。
相关文章:
- 布尔比较运算符是如何在C++中工作的
- 在 c++ 中对字符串进行操作的关系运算符无法按预期工作
- C++编程:运算符重载中的引用如何工作?
- 编译"运算符删除"时C++编译器如何工作?
- C++,()运算符重载,它的工作是什么
- 错误:三元运算符无法在对象中正常工作"cout"
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- C++自定义删除运算符不能正常工作?
- 为什么我的模运算符无法正常工作?
- ostream_iterator运算符=在pair<int,int>上失败,但在包装器类上工作。我不能为成对<>重载运算符<<吗?
- 变量地址的运算符[]是如何工作的
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 如何使用while循环找到GCD?模数运算符是如何工作的
- 让类与运算符一起工作更简单的方法
- 枚举运算符不工作
- 为什么运算符"new"需要指针才能工作?
- 有人可以解释速记赋值运算符的实际工作原理吗?
- c++运算符=工作异常(函数内部输出正常,但返回后错误)
- 如何使这个分数加法运算符工作