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

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

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

В чем причина этого?

4b9b3361

Ответ 1

Я не на 100% уверен в этом, но это может быть для предотвращения неоднозначности синтаксиса. Например, рассмотрим следующий класс:

class BadTimes {
    struct Overloaded;
    int Overloaded;            // Legal, but a very strange idea.

    int confusing(Overloaded); // <-- This line
};

Что означает обозначенная линия? Как написано, это объявление функции-члена с именем confusing, которое принимает в качестве параметра объект типа Overloaded (имя которого не указано в объявлении функции) и возвращает int. Если С++ 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, потому что нет возможности прочитать его как объявление функции.

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