class 包装数组的转换与下标运算符重载
Conversion vs subscript operator overload for class wrapping an array
我有一个 class 包装数组并希望为其用户提供典型的下标访问。
...
class C;
C c;
auto x = c[0];
...
我可能都提供转换
class C
{
int i[10];
public:
operator int*() { return i; }
};
并提供下标运算符重载
class C
{
int i[10];
public:
int& operator[](unsigned idx) {
// eventual out-of-bounds check
return i[idx];
}
};
除了OOB检查,应该首选哪个?
如果您只想在 class C
上调用 operator[]
,那么只需重载 operator[]
。如无必要,不允许隐式转换。如果你提供 operator int*
,一些无意义和危险的东西也会被允许。例如
C c;
if (c) ...;
delete c;
我有一个 class 包装数组并希望为其用户提供典型的下标访问。
...
class C;
C c;
auto x = c[0];
...
我可能都提供转换
class C
{
int i[10];
public:
operator int*() { return i; }
};
并提供下标运算符重载
class C
{
int i[10];
public:
int& operator[](unsigned idx) {
// eventual out-of-bounds check
return i[idx];
}
};
除了OOB检查,应该首选哪个?
如果您只想在 class C
上调用 operator[]
,那么只需重载 operator[]
。如无必要,不允许隐式转换。如果你提供 operator int*
,一些无意义和危险的东西也会被允许。例如
C c;
if (c) ...;
delete c;