Почему в классе инициализаторы могут использовать только = или {}?

Инициализаторы в классе (Функция C ++ 11) должна быть заключена в фигурные скобки или следовать за знаком =. Они не могут быть указаны в скобках.

Что является причиной этого?

20

Решение

Я не уверен на 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потому что нет способа прочитать его как объявление функции.

Надеюсь это поможет!

32

Другие решения

Других решений пока нет …

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