В §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.
я согласен с Bellocаргумент. Примечание можно было бы написать со следующим изменением (жирным шрифтом), чтобы дать ему более точное значение, в данном случае слово remove
не имеет смысла.
Объект объявление может быть явно устранено неоднозначностью путем приведения типа, не являющегося функцией, с помощью = для обозначения инициализации или с помощью удаление вставка избыточные скобки вокруг имени параметра. —Конечная записка
Я должен согласиться с комментарием 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 и принимая три аргумента. Тип первые два
аргументами является точка, и каждый из этих аргументов сопровождается
имя параметра в лишних скобках. Тип третий
Аргумент не может быть определен, потому что это буквальный. Это будет
привести к синтаксической ошибке.