虽然我不知道你不能在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
您没有将多个参数传递给重载运算符,而是使用comma operator来计算单个函数参数。除了让你不喜欢的同事感到困惑之外,没有任何好处。该声明
numbers[i++,i+=1,i=1,i+1]
评估i++
,然后i += 1
,然后i = 1
,然后i + 1
并返回最后评估的表达式,即2
。
虽然逗号运算符有valid use cases,但这不是其中之一。
在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];
除了可能的副作用,没有任何好处,因为你的numbers[i++, i+=1, i=1, i+1]
表达式评估numbers[i+1]
等于numbers[2]
,因为使用逗号运算符时的工作方式。我们可以说这是令人困惑的,难以阅读并且没有任何好处。
这可能适用于Python等解释性语言,但不适用于C ++。
在这种情况下,你必须用前面的numbers
链接它们
...<<numbers[i-1]<<number[i]<<...
尝试围绕此限制进行设计。