不允许在C++中使用多参数运算符 [] 的根本原因

Fundamental reasons for not allowing multi-arguments operator[] in C++

本文关键字:运算符 参数 C++ 不允许      更新时间:2023-10-16

目前,我们只能用一个参数重载operator[]

我想知道标准不允许为多个参数重载operator[]是否有根本原因?

C++17 有这种方式的 propoposal 吗?

这可能可以添加,但不应该添加,因为它会破坏现有代码

基本上,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
}

这意味着,在方括号内使用逗号的表达式中,可以是参数列表或使用逗号运算符。因此,运算符 [] 的参数只能只有一个有效数字,这意味着无法解决此问题:

struct Foo
{
    int operator[](int a, int b, int c)
    {
        return 0;
    }
    int operator[](int a)
    {
        return 1;
    }
}

这里没有办法消除1, 2, 3的歧义。这意味着:如果标准更改为允许这样做,则在调用operator[]时使用逗号运算符的任何代码都将成为编译错误。标准委员会努力不破坏现有代码(这是一件好事!)引入新功能。在我看来,这将是一个相当激进的变化,因此不太可能完成。

如果你想要多个参数,要么使用不同的运算符(正如 Mike 建议的那样,operator()会起作用)或传递一个std::tuple或等效项。

我想知道标准不允许为几个参数重载operator[]是否有根本原因?

没有根本原因;只是重载运算符与它们重载的内置运算符具有相同语法的一般原则。

C++17 有这种方式的 propoposal 吗?

不。一种常见的替代方案是过载operator();这可以接受任意数量的参数。