Примечание в §8.2 [dcl.ambig.res] / 2 в N4140

В §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.

2

Решение

я согласен с Bellocаргумент. Примечание можно было бы написать со следующим изменением (жирным шрифтом), чтобы дать ему более точное значение, в данном случае слово remove не имеет смысла.

Объект объявление может быть явно устранено неоднозначностью путем приведения типа, не являющегося функцией, с помощью = для обозначения инициализации или с помощью удаление вставка избыточные скобки вокруг имени параметра. —Конечная записка

-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 и принимая три аргумента. Тип первые два
аргументами является точка, и каждый из этих аргументов сопровождается
имя параметра в лишних скобках.
Тип третий
Аргумент не может быть определен, потому что это буквальный. Это будет
привести к синтаксической ошибке.

1

По вопросам рекламы [email protected]