Я столкнулся с этим синтаксисом в файле C ++:
Obj obj = {};
Что оно делает? Это просто вызывает конструктор по умолчанию?
Скобки вокруг выражений представляют совокупность значений, и {}
представляет пустой список значений.
Да, {}
просто вызывает конструктор по умолчанию. (Это также гарантирует, что все члены инициализируются каким-либо образом, даже если класс не предоставляет конструктор по умолчанию. Это называется «инициализация значения».)
До C ++ 11 он использовал бы агрегатную инициализацию со значениями по умолчанию для всех членов. Однако это уже было то же самое, что и инициализация значения, то есть поведение «вызова конструктора по умолчанию». (Фактически, инициализация значения — это понятие, изобретенное C ++ 03, чтобы позволить ориентированному на конструктор синтаксису представлять то, что уже существовало с агрегатными типами.)
Есть небольшая странность: он не будет вызывать конструктор по умолчанию, объявленный explicit
вместо выдачи ошибки. Решение никогда не объявлять explicit
конструктор по умолчанию. Если вы застряли с таким конструктором, избавьтесь от =
и скажи Obj obj{}
,
Эта форма инициализации называется Список инициализация в С ++ 11 и копирование списка инициализация в C ++ 14. Это эквивалентно прямой список инициализация Obj obj{};
(на языке C ++ 14), если требуемый конструктор неexplicit
, который просто значение-инициализирует объект.
(Что это означает в деталях, зависит от того, Obj
является фундаментальным типом или типом класса, и какие конструкторы были объявлены для него.)
Для C этот синтаксис пустой {}
не является действительным. Для корректного инициализатора вам нужно как минимум одно значение для поля. Стандарты C способствуют { 0 }
как универсальный инициализатор «все в ноль», который был бы эквивалентен C ++ {}
,