将多个参数传递给operator []

问题描述 投票:1回答:4

虽然我不知道你不能在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

c++ operator-keyword
4个回答
5
投票

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

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

评估i++,然后i += 1,然后i = 1,然后i + 1并返回最后评估的表达式,即2

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


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];

1
投票

除了可能的副作用,没有任何好处,因为你的numbers[i++, i+=1, i=1, i+1]表达式评估numbers[i+1]等于numbers[2],因为使用逗号运算符时的工作方式。我们可以说这是令人困惑的,难以阅读并且没有任何好处。


0
投票

这可能适用于Python等解释性语言,但不适用于C ++。

在这种情况下,你必须用前面的numbers链接它们

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

尝试围绕此限制进行设计。

© www.soinside.com 2019 - 2024. All rights reserved.