c ++ 11 — Что это за синтаксис C ++ C11: & quot; = {} & quot ;?

Я столкнулся с этим синтаксисом в файле C ++:

Obj obj = {};

Что оно делает? Это просто вызывает конструктор по умолчанию?

1

Решение

Скобки вокруг выражений представляют совокупность значений, и {} представляет пустой список значений.

Да, {} просто вызывает конструктор по умолчанию. (Это также гарантирует, что все члены инициализируются каким-либо образом, даже если класс не предоставляет конструктор по умолчанию. Это называется «инициализация значения».)

До C ++ 11 он использовал бы агрегатную инициализацию со значениями по умолчанию для всех членов. Однако это уже было то же самое, что и инициализация значения, то есть поведение «вызова конструктора по умолчанию». (Фактически, инициализация значения — это понятие, изобретенное C ++ 03, чтобы позволить ориентированному на конструктор синтаксису представлять то, что уже существовало с агрегатными типами.)

Есть небольшая странность: он не будет вызывать конструктор по умолчанию, объявленный explicitвместо выдачи ошибки. Решение никогда не объявлять explicit конструктор по умолчанию. Если вы застряли с таким конструктором, избавьтесь от = и скажи Obj obj{},

6

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

Эта форма инициализации называется Список инициализация в С ++ 11 и копирование списка инициализация в C ++ 14. Это эквивалентно прямой список инициализация Obj obj{}; (на языке C ++ 14), если требуемый конструктор неexplicit, который просто значение-инициализирует объект.

(Что это означает в деталях, зависит от того, Obj является фундаментальным типом или типом класса, и какие конструкторы были объявлены для него.)

4

Для C этот синтаксис пустой {} не является действительным. Для корректного инициализатора вам нужно как минимум одно значение для поля. Стандарты C способствуют { 0 } как универсальный инициализатор «все в ноль», который был бы эквивалентен C ++ {},

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