C ++ 0x не неоднозначность обобщенных инициализаторов - PullRequest
1 голос
/ 20 августа 2011

Я нашел пару примеров нового Синтаксиса инициализатора с использованием {...}. Но примеры довольно старые. Я просто хочу перепроверить - текущая ситуация по-прежнему, как описано?

В каждом контексте (особенно в шаблонах) следующие фрагменты исходного кода всегда не неоднозначны - независимо от того, какие T и v.

  • T{v}; - всегда создает временный тип T и инициализирует его значением v.
  • T x{v}; - инициализируется переменная x типа T со значением v.
  • T x = {v}; - то же самое, потому что = здесь просто необязательно.
  • T a[] = {v}; - инициализирует все элементы массива значением v.
  • p = new T{v}; - размещает объект типа T в куче и инициализирует его значением v.

Следовательно, это все еще верно, говоря людям "Предпочитайте синтаксис {}, и ваш исходный код не будет иметь разного значения, в зависимости от того, что T и v" "1042 *.

1 Ответ

6 голосов
/ 21 августа 2011
  • T x{v}; - инициализировал переменную x типа T со значением v.
  • T x = {v}; - то же самое, потому что = здесь просто необязательно.

Что касается N3291 (последний рабочий проект перед окончательным стандартом), они не одинаковы для всех возможных v и T.

Принципиальное отличие заключается в следующем.Первый - это явный вызов конструктора, и поэтому он может выбрать конструктор, объявленный explicit.Вторым является , а не явный вызов конструктора (даже если он будет вызывать конструктор).Поэтому он не может выбрать explicit конструкторов.

Из 13.3.1.7:

При инициализации копирования списка все функции-кандидаты являются конструкторамиT. Однако, если выбран явный конструктор, инициализация является некорректной.

Цель этого состоит в том, чтобы гарантировать, что вы не сможете случайно выполнить преобразование explicit значения при использовании копирования.инициализация, даже с синтаксисом {}.

...