Что?
Начиная с C ++ 11 у нас есть инициализаторы нестатических элементов данных , что делает этот подход к инициализации элементов полностью допустимым. Однако, вы должны использовать либо =
, либо {}
.
Формально, если здесь присутствует инициализатор, это должно быть с грамматической продукцией .
Поскольку вместо этого вы использовали синтаксис, который не считается какПри инициализации здесь компилятор пытается сделать объявление функции из vec
, что прерывается, потому что 20
не является типом.
Почему?
Глава под названием «Проблема»1 "в первоначальном предложении о функции ( N2756 ) объясняет, что здесь ()
было запрещено, чтобы избежать некоторой путаницы в отношении объявлений функций-членов.
Автор отмечает, что комитет мог бы позволить этому быть и работать как другие объявления - то есть, если это возможно, это функция, а в противном случае - объект *.Но автор решил пойти в другом направлении и просто запретить синтаксис, чтобы избежать проблемы в данном конкретном случае.
К сожалению, это делает инициализаторы «( expression-list)) ”неоднозначно во время анализа объявления [..]
Одно из возможных решений - полагаться на существующее правило, которое:если объявление может быть объектом или функцией, то это функция [..]
Аналогичным решением будет применение другого существующего правила, которое в настоящее время используется только в шаблонах.что если T
может быть типом или чем-то еще, то это что-то еще;и мы можем использовать «typename
», если мы действительно имеем в виду тип [..]
Оба этих решения содержат тонкости, которые, вероятно, будут неправильно поняты многими пользователями (о чем свидетельствует множество вопросов на comp.lang.c ++ о том, почему «int i();
» в области видимости блока не объявляет инициализированный по умолчанию int
).
Предлагаемое решениев этой статье разрешено только инициализировать формы «= initializer-clause » и «{ initializer-list }». Это решает проблему неоднозначности в большинстве случаев.
Такова жизнь.
Итак?
Я пытаюсь создать вектор размером 10 дюймов, а не векторс 10 уже вставленным в него.
Это важный момент.Будьте осторожны, потому что инициализация вектора с {}
не сделает это .К сожалению, «единообразная» инициализация просто добавила больше значений .Так много для решения проблемы неоднозначности ...
Поэтому вы должны использовать либо синтаксис =
, либо просто сделать это в конструкторе (мой любимый).
*Вот где самый неприятный синтаксический анализ может иногда кусать вас, хотя не каждое появление непреднамеренных объявлений функций является примером самого неприятного синтаксического анализа.