yul*_*tan 9 c++ operator-overloading comma language-lawyer
从前一个问题当所有逗号运算符都不作为逗号运算符?,我明白函数调用中的逗号只能充当表达式sperator.但是从下面的代码中可以看出,operator()行为类似于函数调用,而operator[]不是.
所以我有两个问题:
operator[]调用而不在operator()调用内?f(a,b)是否与任何f声明的arity或类型都不匹配,不会尝试更改逗号状态并查看是否f(a.operator,(b))导致可接受的synthax?从我的角度来看,它将是与类型转换相同的过程.代码示例:
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;
}
Run Code Online (Sandbox Code Playgroud)
为什么逗号运算符在调用内
operator[]调用而不在operator()调用内?
如果你看起来像语法,函数调用的形式是postfix-expression ( expression-list opt ).一个表达式列表(这是一个初始值列表,不与混淆std::initializer_list)是一个的逗号分隔的列表初始化子句小号(假设有至少两个子句).逗号由表达式列表的解析消耗,它具有特殊含义,而不是表达式的一部分.
索引的形式为 postfix-expression [ expr-or-braced-init-list ],此时不会使用逗号,因此出现的任何逗号都必须是表达式的一部分.
是否存在阻止编译器的特定原因,首先检查
f(a,b)是否与arity或任何f声明的类型都不匹配,不会尝试更改逗号状态并查看是否f(a.operator,(b))导致可接受的语法?
我会选择"理智".函数调用是程序的一个非常基本的方面,它们需要简单明了.如果你甚至不知道你传递了多少参数,那将是非常容易出错的.特别是如果使用内置逗号运算符,它只是忽略参数.
而且,强制使用逗号非常简单:添加括号:
Run Code Online (Sandbox Code Playgroud)f(a, (t=3, t+2), c);有三个参数,第二个有价值
5.
这是语法工作,因为内部逗号不能是逗号分隔初始化子句,因为(t=3它不是初始化子句.
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |