N4140 中的 §8.2[dcl.ambig.res]/2 中的注释



§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这个词没有意义。

对象声明可以通过以下方式显式消除歧义:使用非函数风格的强制转换,使用=表示初始化,或者删除,在形参名周围插入多余的圆括号。端注意

相关内容

  • 没有找到相关文章

最新更新