首页 > 解决方案 > 用于包装数组的类的转换与下标运算符重载

问题描述

我有一个包装数组的类,并希望为其用户提供典型的下标访问。

...
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检查,应该首选哪一项?

标签: c++operator-overloadingconversion-operator

解决方案


如果你只想调用operator[]C,那么就重载operator[]。如果没有必要,不要允许隐式转换。如果您提供operator int*,也将允许一些无意义和危险的事情。例如

C c;
if (c) ...;
delete c;

推荐阅读