运算符重载失败,运算符[]和运算符强制转换为int

Operator overloading fail with operator [] and operator cast to int

本文关键字:运算符 转换 int 重载 失败      更新时间:2023-10-16

以下程序不会在VS 2013 SP3上编译。问题出在哪里?我该如何避免?

#include <string>
class Test
{
public:
    operator int()      const   
    { 
        return 42; 
    }
    inline Test *operator[](const std::string &name)
    {
        return this;
    }
};
int main(int argc, char* argv[])
{
    Test ts;
    Test *k = ts["huhu"];
    return 0;
}

输出为:C2666:数字过载具有类似的转换

编译器是正确的。该代码有两种解释:

  1. 用户定义运算符[]和字符串转换

    ts.operator[](std::string("huhu"))
    
  2. 内置运算符[]和int转换

    *(int(ts) + "huhu")
    

这两者都需要一个用户定义的转换,所以它们都一样"好"。

要修复它,正如Yochai所说,给它一个operator[]重载,它只需要一个标准的数组到指针的转换:

inline Test *operator[](const char* name)
{
    return operator[](std::string(name));
}