虽然我不知道您不能在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编译
答案 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]<<...
尝试基于此限制进行设计。