Обсуждение на C ++: использование =, {} и () в качестве инициализаторов. Какой из них использовать? - PullRequest
0 голосов
/ 05 апреля 2020

При чтении основных руководящих принципов C ++ по isocpp я прочитал этот раздел. Я видел эти методы в некотором коде C ++, который я прочитал до сих пор. Например: () были использованы при инициализации полей данных в списке инициализации конструкторов даже для типов primitive, хотя я также видел, что он используется локально. Некоторые используют {} для инициализации переменных. В то время как другие используют это =. Я не знаю, в чем разница между ними. Я имею в виду, что они достигают одного и того же и являются просто разными стилями или имеют разные значения. Может кто-нибудь объяснить!

Ответы [ 3 ]

1 голос
/ 05 апреля 2020

Возможно, вас заинтересует записанный доклад на эту тему - недавняя история создания «работы» по унификации инициализации на C ++ (11 и более поздних версиях):

CppCon 2018: Николай Хосуттис «The Кошмар инициализации в C ++ ”

Некоторые фрагменты из этого разговора:

  • Google в своей инициативе Abseil отклонил попытку« преобразовать »людей в постоянное использование инициализации фигурных скобок. Поэтому они придерживаются принятия / рекомендации «равных» для «прямой» инициализации и скобок, когда инициализация активно применяет некоторую логику c. Николай не одобряет такой подход.
  • Николай предлагает: приложить усилия, чтобы изменить наши привычки и предпочесть фигурную инициализацию. Сейчас это лучше, чем раньше.

PS - Этот доклад также может представлять интерес:

Core C ++ 2019 :: Тимур Думлер :: Инициализация в современном C ++

, это больше о рассмотрении тонкостей различных видов инициализации (а их немало!)

1 голос
/ 05 апреля 2020

Разница между = и фигурными скобками в инициализаторе практически отсутствует. Если вы столкнулись с разницей, вы делаете что-то странное или на компиляторе до C ++ 14.

Основное различие между {} и () заключается в том, что {} не работает неявные преобразования, такие как не explicit конструкторы преобразования и операторы преобразования, переключение между типами со знаком и без знака и расширение или сужение целочисленных значений и значений с плавающей запятой. Из-за этого, общий совет, который я слышал, состоит в том, чтобы по возможности предпочитать {}, чтобы избежать неожиданных преобразований типов.

0 голосов
/ 05 апреля 2020

Обобщенное использование фигурных скобок {} было введено как часть стандарта C ++ 11. Важным свойством здесь является то, что сужающие преобразования не допускаются для {} инициализации. например,

double d = 1.7789856453427678;
int a{d}; //Compile time error - value of d will not fit in a
int a(d); //ok - a is 1
int a = d; //ok - a is 1

Таким образом, инициализация в скобках {} является предпочтительным методом для написания более надежного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...