§8.2[dcl.ambig.]res]/2我们有以下注释(强调是我的):
[注:声明可以通过非函数式强制转换,通过an =表示初始化,或者通过删除参数名周围多余的圆括号。-end note]
不应该是插入而不是删除吗?
考虑下面的例子:
#include <iostream>
struct S{ int i; S(int j) : i(j) {} };
float f = 1.0f;
S s(int(f)); // function declaration
int main()
{
std::cout << s.i << 'n';
}
代码不能编译,因为编译器认为声明S s(int(f));
是一个函数声明。但是,如果我们在参数名称f
(如S s((int(f)));
)周围插入圆括号,代码将编译并打印1。
我不得不同意Simple的评论,它告诉你参数名称周围的括号是多余的。缺陷报告340强化了这一点:消歧义部分的措辞不明确,该部分以非缺陷关闭,并给出了以下示例:
struct Point
{
Point(int){}
};
struct Lattice
{
Lattice(Point, Point, int){}
};
int main(void)
{
int a, b;
Lattice latt(Point(a), Point(b), 3); /* Line X */
}
说:
latt的声明声明了一个返回值为输入Lattice并接受三个参数。的前两个类型参数是Point,每个参数后面都跟一个参数名在多余的圆括号内。第三个的类型参数无法确定,因为它是一个文字。这将导致语法错误。
我同意Belloc的观点。注释可以用以下更改(粗体)来编写,以使其具有更精确的含义,在这种情况下,remove
这个词没有意义。
对象声明可以通过以下方式显式消除歧义:使用非函数风格的强制转换,使用=表示初始化,或者删除,在形参名周围插入多余的圆括号。端注意