In-class initializers (функция C++ 11) должен быть заключен в фигурные скобки или следовать знаку a =. Они не могут быть указаны внутри скобок.Зачем использовать инициализаторы в классе только = или {}?
В чем причина этого?
In-class initializers (функция C++ 11) должен быть заключен в фигурные скобки или следовать знаку a =. Они не могут быть указаны внутри скобок.Зачем использовать инициализаторы в классе только = или {}?
В чем причина этого?
Я не уверен на 100% об этом, но это может быть для предотвращения двусмысленности синтаксиса. Например, рассмотрим следующий класс:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing(Overloaded); // <-- This line
};
Что означает обозначенная линия? Как написано, это объявление функции-члена с именем confusing
, которое принимает в качестве параметра объект типа Overloaded
(имя которого не указано в объявлении функции) и возвращает int
. Если бы C++ 11 разрешал инициализаторам использовать круглые скобки, это было бы неоднозначным, так как оно также может быть определением члена типа int
с именем confusing
, который инициализируется значением элемента данных Overloaded
. (. Это связано с текущей эмиссии с Most Vexing Parse)
Требуя фигурные скобки, эта двусмысленность снимается:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing{Overloaded}; // <-- This line
};
Теперь стало ясно, что confusing
на самом деле является int
инициализируется значением Overloaded
, потому что нет возможности прочитать его как объявление функции.
Надеюсь, это поможет!
Не могли бы вы объяснить, почему «запутывание» - это определение, а не декларация? ** "это определение функции-члена с именем confusing, которая принимает в качестве параметра объект типа Overloaded" **. У меня такая путаница, потому что она должна быть двусмысленной? –
@ Koushik- Вы правы, это должно быть заявление, а не определение. Позвольте мне исправить это ... – templatetypedef