【发布时间】:2017-12-19 13:38:57
【问题描述】:
从前一个问题When all does comma operator not act as a comma operator? 中,我了解到函数调用中的逗号只能充当表达式分隔符。但从下面的代码来看,operator() 的行为类似于函数调用,而operator[] 则不然。
所以我有两个问题:
- 为什么在
operator[]调用中调用逗号运算符而不在operator()调用中调用? - 是否存在阻止编译器的特定原因,首先检查
f(a,b)是否与任何 f 声明的 arity 或类型都不匹配,不会尝试更改逗号状态并查看f(a.operator,(b))是否导致可接受的合成器?在我看来,这与类型转换所带来的过程相同。
代码示例:
struct A{ };
struct B {
A operator,(const B & other) const { return A(); }
};
struct C {
C(){}
C(const A & a){}
void operator[](const A & a) const {}
void operator()(const A & a) const {}
};
void f(const A & a){}
int main()
{
B x,y;
C z;
//these do no compile because ',' in a function call is an argument separator
//C(x,y);
//f(x,y);
//but this one compiles as z[x.operator,(y)]
z[x,y];
//and this one does not
//z(x,y);
//finally all of these do compile
z((x,y));
C((x,y));
f((x,y));
return 0;
}
【问题讨论】:
-
看看“表达式”可以在语法中的什么地方使用。不是表达式中的参数包。数组索引是一个表达式。逗号运算符只能用于表达式。在某些情况下,用圆括号括起来可以将它们变成表达式。如需完整答案,请添加语言律师标签和/或阅读标准。
-
好吧,
operator()被称为"function call operator",因为它被使用(并且解析)。 -
那不会使代码更具可读性,你不觉得吗?
-
如果
operator,的存在可以决定z(x,y)是否有一个或两个参数,那将是令人难以置信的混乱。 -
@molbdnilo:这太轻描淡写了。在存在重载的情况下,您甚至不知道要考虑 哪个
f。当f接受两个参数时,如何看待f(x,y,z)- 你是否同时尝试f(x,(y,z))和f((x,y),z)?
标签: c++ operator-overloading language-lawyer comma