Копировать инициализацию в конструктор инициализатора? - PullRequest
1 голос
/ 04 ноября 2011

Почему мой инициализатор конструктора не использует инициализацию копирования?

struct S { int a; S(int b) : a(b)  {} }; // direct initialization compiles
struct T { int a; T(int b) : a = b {} }; // copy initialization does not

Я запутался, потому что a(b) и a = b являются обоими выражениями (выражения postfix и assignent, соответственно), и моя книга на C ++ [1] говорит, что «инициализатором может быть любое произвольно сложное выражение».

[1] Липпман, Ладжой, Му. "C ++ Primer, 4-е изд." p457.

1 Ответ

3 голосов
/ 04 ноября 2011

Это не прямая инициализация.T a = b; называется инициализация копирования .Прямая инициализация - T a(1, 'foo', false);, и в своем конструкторе вы должны написать знакомый T(int b) : a(b, 'foo', false) { } для достижения этого эффекта, как у вас уже есть в вашем первом примере.

В отличие от этого, T a; называется Инициализация по умолчанию , чего вы достигнете, оставив переменную в списке инициализаторов полностью без упоминания.Его эффект заключается в том, чтобы вызвать конструктор по умолчанию для типов классов и вообще не выполнять инициализацию для фундаментальных типов (то же самое для массивов).

В отличие от этого, инициализация значения может быть записана какT(int b) : a() { }.Вы также можете использовать инициализацию значения в выражениях new, но они сложнее в автоматических объявлениях из-за неприятного разбора.

Я думаю, что прямая инициализация, инициализация по умолчанию и значения являются единственно допустимыми формами инициализации в инициализаторесписки в C ++ 98/03, в то время как C ++ 11 добавляет различные варианты равномерной инициализации в смесь.

...