为什么逗号运算符在operator []内调用,而不是在operator()内?

时间:2017-12-19 13:38:58

标签: c++ operator-overloading language-lawyer comma

从前一个问题When all does comma operator not act as a comma operator?开始,我理解函数调用中的逗号只能作为表达式编写器。但是从下面的代码中可以看出,operator()的行为与函数调用类似,而operator[]则不然。

所以我有两个问题:

  1. 为什么逗号运算符在operator[]调用内而不在operator()调用内??
  2. 是否存在阻止编译器的特定原因,首先检查f(a,b)是否与任何f声明的arity或类型都不匹配,不会尝试更改逗号状态并查看是否{{1}导致可接受的合成器?从我的角度来看,这将是与类型转换相同的过程。
  3. 代码示例:

    f(a.operator,(b))

1 个答案:

答案 0 :(得分:9)

  

为什么逗号运算符在operator[]调用内调用,而不在operator()调用内?

如果您查看grammatically,则函数调用的格式为 postfix-expression ( expression-list opt )表达式列表initializer-list,不要与std::initializer_list混淆)是comma separated list of initializer-clauses(假设至少有两个子句)。逗号通过解析表达式列表来消费,它具有特殊含义,而不是表达式的一部分。

索引的格式为 postfix-expression [ expr-or-braced-init-list ],没有逗号此时被消费,因此出现的任何逗号都必然是expression的一部分。

  

是否存在阻止编译器的特定原因,首先检查f(a,b)是否与任何f声明的arity或类型不匹配,不会尝试更改逗号状态并查看是否f(a.operator,(b))会产生可接受的语法吗?

我会选择"理智。"函数调用是程序的一个非常基本的方面,它们需要简单明了。如果你甚至不知道你传递了多少个论点,那就太疯狂了。特别是如果使用内置逗号运算符,它只是忽略参数。

此外,强制使用逗号非常简单:add parentheses

f(a, (t=3, t+2), c);
     

有三个参数,第二个参数的值为5

这在语法上有效,因为内部逗号不能用逗号分隔 initializer-clause ,因为(t=3不是 initializer-clause