Ответ 1
Инициализация нестатических членов не может быть выполнена так, как это было до С++ 11. Если вы компилируете компилятор С++ 11, он должен с радостью принять код, который вы указали.
Я предполагаю, что причина не позволять ему в первую очередь состоит в том, что объявление члена данных не является определением. Объекта не вводится. Если у вас есть элемент данных, такой как int x;
, объект int
не создается, пока вы фактически не создадите объект типа класса. Следовательно, инициализатор этого элемента будет вводить в заблуждение. Только во время построения значение может быть присвоено члену, что и есть для списков инициализации членов.
Были также некоторые технические проблемы, которые можно было бы сгладить, прежде чем можно было бы добавить инициализацию нестатического члена. Рассмотрим следующие примеры:
struct S {
int i(x);
// ...
static int x;
};
struct T {
int i(x);
// ...
typedef int x;
};
Когда эти структуры разбираются во время разбора элемента i
, он неоднозначен, является ли это объявлением члена данных (как в S
) или объявлением функции-члена (как в T
),.
С добавленной функциональностью это не проблема, потому что вы не можете инициализировать элемент с помощью этого синтаксиса скобок. Вы должны использовать логический или равный инициализатор, например:
int i = x;
int i{x};
Это могут быть только члены данных, поэтому у нас больше нет проблем.
См. предложение N2628 для более тщательного изучения проблем, которые необходимо учитывать при разработке инициализаторов нестатического элемента.