2

§8.2[dcl.ambig.res]/2我们有以下注释(重点是我的):

[ 注意:声明可以通过非函数风格的强制转换、= 表示初始化或 删除参数名称周围的多余括号来明确消除歧义。——尾注]

它不应该在上面插入而不是删除吗?

考虑以下示例:

#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 一样。

4

2 回答 2

1

我必须同意 Simple 的评论,它告诉您参数名称周围的括号是多余的。缺陷报告 340加强了这一点:消歧部分中的措辞不清楚,该部分被关闭为 Not A Defect,并给出了以下示例:

  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,每个参数后跟一个带冗余括号的参数名称。第三个参数的类型无法确定,因为它是一个字面量。这将导致语法错误。

于 2015-10-23T13:09:13.840 回答
-1

我同意贝洛克的论点。注释可能已经写了以下更改(粗体)以赋予它更精确的含义,在这种情况下,这个词remove没有意义。

对象声明可以通过非函数式强制转换、= 来指示初始化或删除在参数名称周围插入多余的括号来明确消除歧义。——尾注

于 2015-10-23T16:28:24.947 回答