Когда мы должны использовать синтаксис скобок () или инициализатора {} для инициализации объектов в C ++ 11?

Обновлено

Я просмотрел ссылки (например, Когда использовать инициализатор, заключенный в фигурные скобки?) о том, когда следует использовать инициализацию {} скобок, но не дается информация о том, когда следует использовать синтаксис ( ) скобок и инициализатор { } для инициализации объектов в C ++ 11/14? Какие стандартные практики предлагают использовать () вместо {}?

В редких случаях, таких как vector<int> v(10,20); или auto v = vector<int>(10,20);, результатом будет std::vector с 10 элементами. Если мы используем фигурные скобки, результатом будет std::vector с двумя элементами. Но это зависит от варианта использования вызывающего абонента: либо он / она хочет выделить вектор из 10 элементов или 2 элементов?


person Ajay yadav    schedule 09.02.2016    source источник
comment
Используйте (), когда хотите вызвать конструктор.   -  person alcedine    schedule 09.02.2016
comment
@alcedine Вы также можете использовать {}, когда хотите вызвать конструктор. В этом отношении () vs. {} не имеет значения.   -  person juanchopanza    schedule 09.02.2016
comment
@juanchopanza так кажется! Я не знал этого.   -  person alcedine    schedule 09.02.2016
comment
@juanchopanza Я думаю, что это не дубликат, который выделен в этом вопросе, когда использовать {} вместо Когда мы должны использовать круглые скобки ()   -  person Ajay yadav    schedule 09.02.2016


Ответы (2)


Скотт Мейерс рассматривает эту проблему в пункте 7 своего фантастического «Эффективного современного C ++». Он рассматривает различия, плюсы и минусы обоих синтаксисов и делает вывод:

Нет единого мнения о том, что один из подходов лучше другого, поэтому я советую выбрать один и применять его последовательно.

С другой стороны, основные рекомендации C ++ предполагают, что вы предпочитают синтаксис инициализатора, так что, возможно, это лучший вариант по умолчанию.

person Tristan Brindle    schedule 09.02.2016
comment
Лично я склонен соглашаться с Мейерсом в этом, но во многих случаях мне также приходится писать код, который должен быть построен на более старых версиях Visual C ++, в которых отсутствует поддержка списков инициализаторов {}. Как и auto, это чаще всего вопрос суждения, где он улучшает или затемняет удобочитаемость. Тем не менее, если вы новичок в C ++, вы, вероятно, будете в большей безопасности с правилами для инициализаторов {} в соответствии с основными руководящими принципами. - person Chuck Walbourn; 09.02.2016

Поздравляем, вы только что натолкнулись на канонический пример того, почему вам следует предпочесть инициализацию в скобках, если ваш компилятор поддерживает.

Если вам нужен std::vector из двух элементов, используйте:

vector<int> v = { 10, 20 };

Если вы используете vector<int> v(10,20);, вы фактически вызываете конструктор, который принимает два целочисленных преобразуемых элемента, которые являются сигнатурой explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type()); Помните, что std::vector был добавлен в язык в C ++ 98, в то время как инициализация в фигурных скобках не добавлялась до C ++ 11.

См. основные принципы C ++, в частности ES.23: предпочитайте синтаксис инициализатора {}

person Chuck Walbourn    schedule 09.02.2016
comment
Почему это пример того, почему нужно предпочесть одно другому? Для меня это больше похоже на пример, когда у вас фактически нет выбора. - person juanchopanza; 09.02.2016
comment
Это подробно описано Хербом Саттером и Бьярном Страуструпом в ссылке на Core C ++ Guidelines. - person Chuck Walbourn; 20.09.2016