目前,我们只能operator[]用一个参数重载。
我想知道标准不允许operator[]多个参数重载的根本原因是什么?
对于 C++17 有这种方式的建议吗?
目前,我们只能operator[]用一个参数重载。
我想知道标准不允许operator[]多个参数重载的根本原因是什么?
对于 C++17 有这种方式的建议吗?
这可能可以添加,但是不应该添加,因为它破坏了现有代码。
基本上,有什么多重论据operator[]意味着以下将编译:
struct Foo
{
    int operator[](int a, int b, int c)
    {
        return 0;
    }
}
int main()
{
    Foo foo;
    auto n = foo[1, 2, 3]; // list of parameters
}
但是考虑一下:
int main()
{
    Foo foo;
    std::vector<int> bar(4, 0);
    auto n = foo[1, 2, 3]; // list of parameters
    auto x = bar[1, 2, 3]; // comma operator! returning the 3rd element of bar. valid syntax
}
这意味着,在方括号内使用逗号的表达式可以是参数列表或使用逗号运算符。因此,operator[] 的参数只能有一个有效数字,这意味着无法解决:
struct Foo
{
    int operator[](int a, int b, int c)
    {
        return 0;
    }
    int operator[](int a)
    {
        return 1;
    }
}
没有办法消除歧义1, 2, 3这里的歧义。这意味着:如果标准更改为允许这样做,则在调用中使用逗号运算符的任何代码operator[]都将成为编译错误。通过引入新功能,标准委员会努力不破坏现有代码(这是一件好事!)。在我看来,这将是一个相当彻底的改变,因此不太可能做到。
如果您需要多个参数,请使用不同的运算符(如 Mike 建议的operator()那样)或传递 astd::tuple或等效参数。
我想知道标准不允许
operator[]多个参数重载的根本原因是什么?
没有根本原因;只是重载运算符与它们重载的内置运算符具有相同语法的一般原则。
对于 C++17 有这种方式的建议吗?
不,一个常见的替代方法是重载operator();这可以接受任意数量的参数。