将多个参数传递给operator []

时间:2018-09-11 12:02:33

标签: c++ operator-keyword

虽然我不知道您不能在C ++中重载operator[]来接受多个参数,但我偶然发现了似乎令我惊讶的语句:

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> numbers{1, 2, 3, 4};

    int i = 0;
    std::cout << numbers[i++,i+=1,i=1,i+1] << std::endl;
    return 0;
}

那么任何人都可以解释一下将多个表达式传递给operator[]是否有好处?

使用mingw g ++ 4.8.1和-std = c ++ 11编译

4 个答案:

答案 0 :(得分:5)

您没有将多个参数传递给重载的运算符,而是使用comma operator来评估单个函数参数。除了使您不喜欢的同事困惑之外,没有任何好处。声明

numbers[i++,i+=1,i=1,i+1]

先对i++,然后对i += 1,对i = 1,对i + 1进行求值,然后返回最后一个求值表达式2

尽管逗号运算符有valid use cases,但这不是其中之一。

答案 1 :(得分:1)

除了可能的副作用外,没有任何好处,因为您的numbers[i++, i+=1, i=1, i+1]表达式的计算结果为numbers[i+1],它等于numbers[2],这是因为使用逗号运算符时事情如何工作。我们可以说这令人困惑,难以理解并且没有好处。

答案 2 :(得分:1)

在C ++中,逗号既用作分隔符,又用作运算符。在这种情况下,它可以用作operator

  

在逗号表达式E1,E2中,对表达式E1进行求值,结果将被丢弃(尽管它具有类类型,但直到包含完整表达式的末尾才会被销毁),并且其副作用在表达式E2的计算开始之前就已经完成(请注意,用户定义的运算符不能保证排序)(直到C ++ 17)。

     

逗号表达式结果的类型,值和值类别恰好是第二个操作数E2的类型,值和值类别。如果E2是一个临时表达式(自C ++ 17起),则表达式的结果就是该临时表达式(自C ++ 17起)。如果E2是位字段,则结果是位字段。

所以

numbers[i++,i+=1,i=1,i+1];

成为

numbers[i+1];

答案 3 :(得分:0)

这可能适用于Python之类的解释语言,但不适用于C ++。

在这种情况下,您必须将其与前面的numbers链接

...<<numbers[i-1]<<number[i]<<...

尝试基于此限制进行设计。