Вопросы с тегами [uniform-initialization]

1

голосов
1

ответ
23

Просмотры

Инициализация вектора в равномерной инициализации

Я использую тест следующего кода класса {общественности: тест (станд :: вектор Обл) {авто а = ули [0]; а = «В»; } Тест () {} Const станд :: MultiMap _var = {{0x01, {{0x0F, станд :: вектор { "А", "В", "С", "D"}}}}}; }; INT основных () {тест т; станд :: соиЬ
Rajeshwar
1

голосов
2

ответ
40

Просмотры

Передача списка инициализации в конструктор вектора на основе

Я в настоящее время теста следующего кода класса {общественность: тест (станд :: вектор НТР) {} тест () {} Const зОго :: MultiMap _var = {{0x01, {{0x0F, { "A", "B", "CD"} } } } }; }; INT основных () {тест т; } Ошибка: main.cpp: 29: 9: ошибка: не удалось преобразовать '{{1, {{15, { "А", "В", "С", "D"}}}}}' от '' к 'сопзЬ станд :: MultiMap'}; ^ Я хотел бы знать, почему прохождение { "A", "B", "C", "D"} к StD :: вектор строка) не удается? Любые предложения о том, как я могу решить эту проблему?
Rajeshwar
1

голосов
2

ответ
846

Просмотры

Совокупные инициализации с фигурными скобками

В C ++ 11, являются агрегаты разрешено быть скопированы с синтаксисом фигурных скобок? У меня есть следующий код: STRUCT S {Int х; }; Держатель шаблона {структура держателя шаблона (А && х): т {х} {} T T; }; Каждый из утверждений ниже работ. Auto s1 = s {1}; авто s2 (s1); авто s3 {s1}; /// Примечание: это работает! Однако, второе утверждение ниже повышает погрешность не может преобразовать «S» на «Int» в инициализации. Держатель ч {5}; Держатель h1 {s {5}}; Я использую GCC 4.8.2. Почему я получаю эту ошибку?
abir
1

голосов
1

ответ
992

Просмотры

Unified initialization syntax in C++11

Вопрос о «едином синтаксисе инициализации» в C ++ 11. Законно ли это инициализировать-структуру со следующим синтаксисом в C ++ 11 (посмотреть на линии # 128-137)? Или POD все еще актуальна? http://pastebin.com/GMZ5QDmR Проблема с 2013 компилятором MSVC. Этот пример компилируется успешно, но падает с плохим исключением вызова функции. Это сказал мне станд :: функциональный объект не инициализирован должным образом. Кстати, МТП 13,0 не может скомпилировать код в примере. example.cpp (130): Ошибка # 2084: обозначение не может указать не-POD (Plain Old Data) субобъектом ли это дефект в компиляторах? Или с составителями все нормально, и такой подход не соответствует C ++ 11? Вот короткий пример: #include #include структура dispatcher_t {}; binder_t структура {}; структура factories_t {станд :: Функция <станд :: unique_ptr <dispatcher_t> ()> m_disp_factory; станд :: функция <станд :: unique_ptr <binder_t> ()> m_bind_factory; }; станд :: unique_ptr <dispatcher_t> create_dispatcher () {вернуться станд :: unique_ptr <dispatcher_t> (новый dispatcher_t ()); } Станд :: unique_ptr <binder_t> create_binder () {вернуться станд :: unique_ptr <binder_t> (новый binder_t ()); } Вакуум основных () {factories_t е {[] () {возвращение create_dispatcher (); }, [] () {Возвращение create_binder (); }}; } } Вакуум основных () {factories_t е {[] () {возвращение create_dispatcher (); }, [] () {Возвращение create_binder (); }}; } } Вакуум основных () {factories_t е {[] () {возвращение create_dispatcher (); }, [] () {Возвращение create_binder (); }}; }
Igor Mironchik
1

голосов
1

ответ
51

Просмотры

C ++ 11 изо всех сил, чтобы понять, почему я не могу равномерная инициализации структуры, но я могу инициализировать СТАНД :: пару подобного типа

Учитывая следующий код: #include #include #include тестового класса {общественности: имя структуры Информация {станда :: строку { «»}; станд :: функция FUNC; }; // Информация о my_info { "test_name", [&] {возвращение member_func ();}}; //
code_fodder
0

голосов
4

ответ
31

Просмотры

Инициализировать N размера зЬй :: вектор с станд :: uniform_real_distribution

У меня есть зЬй :: вектор х, кто есть размер я не знаю, во время компиляции. Если предположить, что размер вектора N, я хочу назначить N равномерно распределенные случайные величины к нему. Я в настоящее время сделать это в станд петли :: default_random_engine генератор; станд :: uniform_real_distribution distribution_pos (0.0,1.0); для (авто он = x.begin (!), это = x.end (), она ++) {* это = distribution_pos (генератор); } Это, кажется, не очень элегантно ко мне, так что мне было интересно, если есть более разумный способ сделать это?
Iamanon
17

голосов
2

ответ
426

Просмотры

Скользящая запятая в единой инициализации

Есть ли потенциал семантической разницы, когда я использую Запятую при равномерной инициализации? станд :: вектор <станд :: size_t> v1 {5}; // разрешен синтаксис станд :: вектор <станд :: size_t> v2 {10}; Могу ли я использовать Запятую, чтобы компилятор выбрать зЬй :: вектора :: вектор (станд :: initializer_list <станд :: size_t>) конструктор вместо станда :: вектор :: вектор (Std :: size_t, сопзИте Std :: size_t и) или есть какие-либо другие фокусы с упомянутым синтаксисом? Могу ли я использовать его для обнаружения там станд :: initializer_list-конструктор перегрузка? Учитывая следующий код, который конструктор должен быть выбран? структура А {А (INT) {; } А (двойной, Int = 3) {; }}; А а {1}; A B {2}; Этот код принимается GCC 8 и A (INT) выбран в обоих случаях.
Orient
17

голосов
4

ответ
2.3k

Просмотры

C ++ 0x равномерная инициализация «странность»

Как и многие, я очень рад C ++ 0x. Я стараюсь учиться и использовать новые возможности в новых проектах, так что я могу написать самый лучший, самый простой в обслуживании кода возможно. Излишне говорить, что я люблю эту идею за новые инициализаторами. Так что я смотрю на них, и они имеют смысл для меня: Т х = {1, 2, 3}; // как нативной структуры или массива Т х ({1, 2, 3}); // копирование построить что-то вроде «литерал объекта» на других языках ... круто! Возвращение {1, 2, 3}; // аналогично выше, но вернуть его, даже круче! То, что не имеет смысла для меня это: Т х {1, 2, 3}; Он просто чувствует себя ... странно. Я не уверен, что синтаксис, что люди хотят использовать, что это подражает, она просто не кажется, «право». Что дизайн / думал, за этим синтаксисом? Единственный пример, когда кажется, что он делает различие что-то вроде этого: станд :: вектор the_vec {4}; который будет вызывать конструктор списка инициализатора, но почему бы не написать это тогда: станд :: вектор the_vec = {4}; И делать то, что все это уже комфортно?
Evan Teran
18

голосов
1

ответ
1.7k

Просмотры

Равномерная инициализация ссылок

В настоящее время я пытаюсь понять новую унифицированную инициализацию C ++ 0x. К сожалению, я stumpled над использованием равномерного инициализации ссылок. Пример: INT Основной () {Int А; INT & исх {а}; } Этот пример работает нормально:% ЛАНГ = С г ++ uniform_init_of_ref.cpp -std = C ++ 0x -o уни -Wall -Wextra uniform_init_of_ref.cpp: В функции `Int основной () ': uniform_init_of_ref.cpp: 3: 10: предупреждение : не используется переменная `ссылка«[-Wunused переменного] (Update Комео выдает ошибку для этого примера, поэтому, возможно, НКУ не должны скомпилировать его, а) Теперь, если я использую пользовательский тип данных, а не целое число, Безразлично» т работа больше: класс Y {}; INT основных () {Y Y; Y & исх {у}; }% ЛАНГ = С г ++ initialization.cpp -std = C ++ 0x -o инициализации -Wall -Wextra initialization.cpp: В функции `Int основной () ': initialization.cpp: 9: 13: ошибка: недействительный инициализация неконстантного ссылки типа `Y &«из RValue типа `» initialization.cpp: 9: 8: предупреждение: не используется переменная `ссылка» [-Wunused-переменной] К сожалению, я не нашел соответствующий раздел в стандартном проекте. Я думаю, что я недопонимание использования единой инициализации, а Комео жалуется с этим сообщением: ComeauTest.c (9): ошибка: «ссылка» задающим требует инициализатора Y & исе {у}; Так, может кто-то из вас мне точку в правильном направлении? В случае, если вы хотите знать, почему этот вопрос актуален, и почему я не просто использовать Y & реф (у): Я хотел бы иметь возможность использовать равномерную инициализацию в списке инициализации конструктора: класса X {}; класс У {Const Х & х; общественности: Y (X & Const ая): х {хх} {}}; INT основных () {Х х; У у {х}; } Это не может с тем же сообщением об ошибке, как описано выше. Примечание: Я использую LANG = C, чтобы включить английские сообщения об ошибках. НКУ версия: 4.6.1
evnu
9

голосов
1

ответ
217

Просмотры

Почему равномерная инициализация синтаксис применяется только для объектов?

В C ++ 11 мы имеем хороший синтаксис равномерной инициализации для объектов. Почему это не распространяется на инициализацию типов не-объект, а? Есть ли синтаксический неоднозначности для этого, или это просто какой-то глупый вопрос, я спрашиваю? Пример: STRUCT сек {INT к;}; S s1 {1}; // OK (инициализация объекта) S & Const s3 {3}; // ОК (инициализация объекта) с & s2 {s1}; // ошибка (ссылка инициализации) Более полезный пример: структура т {т (т Const & х): к (хк) {} INT к;}; структура с {с (т & х1, х2 & т): s1_ {x1} // ошибка (ссылка инициализации), s2_ {х2} // нормально (инициализация объекта) {} т & s1_; т s2_; }; Еще один: шаблон T прибудет () {вернуться T {}; } // ОК (инициализация объекта) получить (); // ошибка (? Аннулируются инициализации я не знаю терминологию пустоты () лексема эквивалента) получает ();
abir
19

голосов
2

ответ
1k

Просмотры

T V {} инициализации

Я читаю стандарт C ++ 11, но не могу выяснить, является ли Т х {}; это значение инициализируется или по умолчанию инициализируется (автоматическое хранение). Он сказал довольно ясно, что: 10 Объект, инициализатор пустой набор скобок, то есть (), должно быть значение инициализации. И 11 Если нет инициализатора не указан для объекта, объект по умолчанию инициализируется; Но все, что я могу найти о Т х {}; в том, что: Инициализация, что происходит в формах Т х (а); Т х {а}; а также в новых выражениях (5.3.4), static_cast выражений (5.2.9), преобразования функциональных типов обозначений (5.2.3), а также базовых и членов инициализаторах (12.6.2) называется прямой инициализации. и если инициализатор является (не в скобках) приготовился-INIT-лист, объект или ссылка список инициализируется (8.5.4). Я новичок в дайвинге на уровень чтения стандартов.
zac
6

голосов
2

ответ
472

Просмотры

Равномерная инициализация с {} отчетных неиспользованными переменным

Компиляция кода с г ++ 4.7.0 (-Wall -Wextra -Werror -Wconversion -std = C ++ 11): #include // станд :: соиЬ, станд :: епсИ #include // станд :: строка #include / / станд :: ход недействительными из (станд :: строка & Const сообщение) {статического счетчика INT {0}; станд :: соиЬ
Matt Tardiff
6

голосов
2

ответ
6.5k

Просмотры

Как инициализировать переменную-член вектора в определении класса?

Следующий код компилирует ОК с помощью XCode 5.0, но не Visual Studio 2013. класс #include VectorInit {частное: станд :: вектор m_vector {1, 2, 3}; // не может скомпилировать с помощью VS 2013}; INT основных () {станд :: вектор вектор {1, 2, 3}; VectorInit vectorInit; возвращать 0; } Это ошибка, что отчеты Visual Studio: Ошибка 1 Ошибка C2664: «станд :: вектор :: вектор (станд :: initializer_list, Const станд :: Распределитель &)»: не удается преобразовать аргумент 3 из «межд» до «сопзЬ станд :: распределителем и»C: \ визуально студии 2013 \ Projects \ вектор-INIT \ main.cpp 6 1 вектор-INIT мне не удалось найти пример того, как инициализирует вектор, как это в определении класса. Какой компилятор является правильным? Если синтаксис не является действительным, является единственным вариантом инициализации m_vector в списке инициализатора конструктора?
ksl
5

голосов
2

ответ
372

Просмотры

C ++ 11 Равномерное Initialization Форматированная Некорректно по Затмении

Я пытаюсь использовать C ++ 11 единообразной инициализации в Eclipse CDT Luna 4.4, так что я могу определить, где сужение происходит более легко. У меня есть два вопроса. Во-первых, форматировщик код стиля обработки скобка инициализации, как если бы это был блок кода в разы (пример 2 #). Второе существо, равномерная инициализация без оператора присваивания дает мне как ошибку компилятора и предупреждение (пример 4 #). Мой проект настроен использовать "ISO C ++ 11 (-std = C ++ 0x)" язык стандартный диалект. Использование GCC версии 4.8.1 (GCC). Вот некоторые примеры форматирования каждый из которых содержит до и после того, как код: Пример # 1 - инициализации - Форматы штрафа, не компилятор сообщений: INT х = {9}; INT х = {9}; Пример # 2 - Назначение - вариант форматировщика для «блоков» на «Брекеты» на вкладке управления «если» заявление стиля, он также влияет на поведение ниже присваивание, когда «Blocks» установлен на «Следующую строку». Я хотел бы продолжать использовать стиль скрепить «Следующая строка» (Allman) для моего «если» заявления вместо того, чтобы установить его в «той же линии» (K & R), который также будет остановить новое поведение линии наблюдается здесь: Int x2; х2 = {9}; INT x2; х2 = {9}; Пример # 3 - Инициализация без оператора присваивания - Форматы тонкие, не компилятор сообщений: INT у {9}; INT у {9}; Пример # 4 - Назначение без оператора присваивания - форматы тонких, однако дает ожидаемый «;» Перед «{» маркер ошибки и утверждение не имеет никакого эффекта [-Wunused значение] предупреждение компилятора: INT y2; у2 {9}; ИНТ y2; у2 {9}; Там, кажется, нет никакого среднего. Использование равномерной инициализации для инициализации отлично работает в обоих примерах # 1 и # 3, но когда речь идет о назначении на № 2 и № 4, бывший имеет ошибки форматирования, а второй производит сообщения компилятора. Я новичок ++ C, кто-нибудь есть какие-либо предложения или увидеть слон в комнате в моей логике? Я получаю впечатление, как-то, что равномерная инициализация не должна использоваться для назначения, поскольку я не вижу каких-либо примеров этого, но то, что меня смущает то, что несмотря на то, назначая в # 2 дает ошибки форматирования, то компилятор дает правильный сужающее преобразование .. . [-Wnarrowing] предупреждение компилятора при скармливании числа с плавающей точкой. Любая помощь приветствуется, спасибо! Кто-нибудь есть какие-либо предложения или увидеть слон в комнате в моей логике? Я получаю впечатление, как-то, что равномерная инициализация не должна использоваться для назначения, поскольку я не вижу каких-либо примеров этого, но то, что меня смущает то, что несмотря на то, назначая в # 2 дает ошибки форматирования, то компилятор дает правильный сужающее преобразование .. . [-Wnarrowing] предупреждение компилятора при скармливании числа с плавающей точкой. Любая помощь приветствуется, спасибо! Кто-нибудь есть какие-либо предложения или увидеть слон в комнате в моей логике? Я получаю впечатление, как-то, что равномерная инициализация не должна использоваться для назначения, поскольку я не вижу каких-либо примеров этого, но то, что меня смущает то, что несмотря на то, назначая в # 2 дает ошибки форматирования, то компилятор дает правильный сужающее преобразование .. . [-Wnarrowing] предупреждение компилятора при скармливании числа с плавающей точкой. Любая помощь приветствуется, спасибо!
user3726423
5

голосов
1

ответ
181

Просмотры

C ++ 14 Равномерное Initialization на неагрегированных

Я использую Visual C ++ 2013. Когда класс представляет собой совокупность она равна нулю инициализирован. Когда это не-агрегировать это, кажется, по умолчанию инициализируются и оставил неопределенным. Это почему? # include с помощью патезраса; класс Test_1 {общественности: INT I; недействительными F () {}; }; класс Test_2 {общественности: INT I; виртуальная пустота F () {}; }; INT основных () {t1 Test_1 {}; Test_2 t2 {}; соиЬ
SelymAI
5

голосов
2

ответ
208

Просмотры

Почему инициализация списка C ++ также принимать регулярные конструкторы во внимание?

В C ++ при использовании initializer_list синтаксиса для инициализации объекта, обычные конструкторы объекта также участвуют в разрешении перегрузки, когда не применяется никакого другое правило инициализации списка. Насколько я понимаю, следующий код вызывает X :: X (интермедиат) класс X {INT а_; Х (интермедиат а): а_ (а) {}); недействительными Foo () {Х бар {3}; } Но я не понимаю, почему обычные конструкторы также рассматривается в контексте initializer_lists. Я чувствую, что многие программисты сейчас пишу X {3}, чтобы вызвать конструктор вместо X (3), чтобы вызвать construcor. Мне не нравится этот стиль вообще, как это заставляет меня думать, что объект не имеет регулярный конструктор. В чем причина, почему синтаксис initializer_list также может быть использован для вызова регулярного конструктора? Есть ли причина, чтобы теперь предпочитает этот синтаксис над регулярными заходами конструктора?
Max O
5

голосов
1

ответ
640

Просмотры

Почему некоторые виды не работает с однотипным синтаксисом инициализации?

При обновлении некоторых из моих C ++ 98 кода C ++ 11, я заметил, равномерная инициализация не так однородна. Некоторые из них связаны с неполным типа, как пустота, в то время как другие связаны с стручок. например, для тривиального Copyable типов, равномерная инициализация не работает как прямая инициализацией или копирования инициализации при инициализации включает в себя копирование / перемещение конструктора. например, шаблон T Foo () {вернуться T ( "Hello World");} Foo (); Foo (); -------- шаблон T Foo () {вернуться T { "Hello World"};} Foo (); Foo (); В то время как первая часть компилирует, вторая половина с ошибкой: соединение буквального типа не-объекта «» недействительным STRUCT стручок {INT х; Int у;}; стручка р {1,2}; // нормально стручка р (1,2) ошибка, как обычно, стручок р2 (р); структура Foo {Foo (Foo Const & RHS): р- (rhs.p _) {} стручка р-; }; -------- структура стручка {INT х; INT у;}; стручка р {1,2}; стручка р2 {р}; структура Foo {Foo (Foo Const & RHS): р- {rhs.p _} {} стручка р-; }; Здесь также вторая половина не будет работать на копию конструкции с ошибкой: не может преобразовать «стручка» до «» междунара при инициализации. Хотя я думаю, этот стручок класс тривиальный типа (или даже может быть тривиальным копируемым типом) в C ++ 11, но проблема остается тем же, за исключением примитивных типов Примечания: в то время как следующие работы, структура ко {оператор Int () сопзЬ { вернуться 1;}}; стручка р {1,2}; стручок р2 {ко {}}; Это не значит, структура ко {оператор стручок () сопзИте {вернуть стручок {1,2};}}; стручка р {1,2}; стручок р2 {ко {}}; Я также заметил, C массив делает работу с равномерной инициализации, но не с копирования / перемещения конструктора. Но это может быть связано с массивом является совокупность, которая не имеет копировать / конструктор перемещения или назначения. Хотя я не знаю, почему в C ++ 11 тем, синтаксис не допускаются (в частности, когда они являются членами класса, неявное копирование / перемещение делает именно это). Итак, почему я не могу слепо изменить инициализацию на C ++ 11 стиля инициализации равномерного все C ++ 98 (ну, для типов, который имеет список инициализатора за исключением!)? Я использую GCC 4.8.1
abir
3

голосов
1

ответ
764

Просмотры

Auto with uniform initialization expands to unexpected type

Рассмотрю эту короткую программу, скомпилированную с GCC 4.7.2 G ++ -std = C ++ 11 test.cc типа #include #include структуры {типа (интермедиат а): V (а) {} INT В; }; ЬурейеЕ станд :: shared_ptr type_ptr; INT основных () {INT значение = 3; Очередь станд :: очереди; автоматический PTR {станд :: make_shared (значение)}; queue.push (PTR); } Компилятор выдает следующие ошибки: SRC / test.cc: В функции 'INT Main ()': SRC / test.cc: 15: 17: ошибка: нет функции согласования для вызова «станд :: очереди :: толчок ( станд :: initializer_list &)»SRC / test.cc: 15: 17: Примечание: кандидаты: В файл из /usr/include/c++/4.7/queue:65:0 из SRC / test.cc: 2: / USR / включать / C ++ / 4,7 / бит / stl_queue.h: 211: 7: примечание: пустое зЬй :: очереди :: толчок (Const value_type &) [с _Tp = станд :: shared_ptr; _Sequence = станд :: Deque; станд :: очереди :: value_type = станд :: shared_ptr] /usr/include/c++/4.7/bits/stl_queue.h:211:7: Примечание: нет известного преобразования для аргумента 1 из 'станда :: initializer_list' до 'сопзЬ value_type & {аки Const станд :: shared_ptr &}' /usr/include/c++/4.7/bits/stl_queue.h:216:7: примечание: пустые зЬй: : очереди :: толчок (станд :: очереди :: value_type &&) [с _Tp = станд :: shared_ptr; _Sequence = станд :: Deque; станд :: очередь :: value_type = станд :: shared_ptr] /usr/include/c++/4.7/bits/stl_queue.h:216:7: Примечание: никакой известного преобразования для аргумента 1 из «станда :: initializer_list» до «станда :: очереди :: value_type && {ака станд :: shared_ptr &&} Указав, что тип авто расширяется в список инициализатора вместо станд :: shared_ptr; фактически заменяя {...} с = ... делает код компилировать как автоматически расширяется до нужного типа. Я немного удивлён, что это, казалось бы, очевидный случай использования не удается достичь ожидаемого результата. Тем более, что я помню новый синтаксис инициализации кронштейна быть рекламировали как конец-всего, будет все-решением инициализирующих проблем. Так что мой вопрос: изначально был задуман в стандарте? Или это упущение или даже НКА ошибки? Или я просто думать об этом не так?
Emily L.
5

голосов
3

ответ
386

Просмотры

Почему карта т = {{1,2}, {3,4}, {5,0}}; размер 1, а не 3?

Весьма своеобразное: отображение Мб = {{1,2}, {3,4}, {5,0}}; соиЬ
NoSenseEtAl
2

голосов
1

ответ
145

Просмотры

Невозможно получить переместить конструктор для запуска

C ++ 11 У меня возникли проблемы с помощью конструктора перемещения. У меня есть простой класс контейнера, номер вызываемого абонента, чьи данные только элемент представляет собой целое число. У меня есть следующий код: //Number.h #ifndef NUMBER_H #define NUMBER_H #include номер класса {общественный: Number (); Номер (интермедиат IPAR); Количество (Const Количество & SRC); Число (номер && SRC); частные: INT Num; }; #endif и //Number.cpp #include "Number.h" Количество :: Number () {станд :: соиЬ
CodeBricks
3

голосов
1

ответ
1.6k

Просмотры

Ошибка или нет? Visual Studio 2013 Предварительный список станд :: вектор инициализатор с станд :: строка

В конце концов они сделали это. MSVC12 компилятор теперь позволяет равномерную инициализацию. Но я обнаружил, что он работает по-другому, чем GNU GCC 4.8.1 с -std = C ++ 11 флага. Рассмотрим следующий код: #include #include #include структура данных {Data (Const станд :: строка и имя, Int х): m_name (имя), M_X (х) {} станд :: строка m_name; INT M_X; }; станд :: вектор Данные = {данных ( "один", 1), данные ( "два", 2), данные ( "три", 3),}; ИНТ основной () {для (авто он = datas.begin (); это = datas.end (!); ++ это) станд :: соиЬ m_name
2

голосов
1

ответ
982

Просмотры

Унифицированные инициализации и конструктор по умолчанию аргументы в C ++ 11

Я учусь о новых C ++ 11 особенности - равномерное инициализацию. Написал небольшую программу: #include с помощью патезраса; класс С {общественности: C (INT = 1, B = INT 2): а_ {а}, B_ {B}, {п 0,1,2,3,4} {}; Int N [5]; INT а_, b_; }; INT основных () {C = C {}; // следует называть C (INT = 1, Int B = 2) по умолчанию арг. соиЬ xilink: выполнение 'ссылка' 1> Unif_Init.vcxproj -> C: \ Users \ Alex \ документы \ визуально студии 2012 \ Projects \ Unif_Init \ Debug \ Unif_Init.exe ========== Rebuild All: 1 удалось, 0 не удалось, 0 пропущено ==========
newprint
23

голосов
3

ответ
4.9k

Просмотры

Why does 'std::vector b{2};' create a 1-element vector, and not a 2-element one?

Я играл вокруг с C ++ 11 в течение последних нескольких дней, и я придумал что-то странное. Если я хочу, чтобы равномерно инициализировать Int: Int А {5}; Но если бы я сделать то же самое в станд :: вектор: станд :: вектор Ь {2}; Не построить два элемента массива, а скорее массив с одним элементом значение два. Похоже, что, чтобы получить этот эффект можно было бы необходимо, чтобы быть более четко об этом: станд :: вектор с {{2}}; станд :: вектор d = {2}; Но не так, как заявление о б - это, кажется непоследовательным. Я видел некоторые другие вещи к тому же эффекту. То, что я прошу - это поведение в конечном стандарте C ++ 11, или это только в проекте, который был реализован в начале? Если да, то почему комитет по стандартизации включает в себя такое поведение? Похоже, он побеждает всю цель единой инициализации, а один должен помнить, какие классы имеют инициализатора список конструкторов, и использовать старый () синтаксис вместо {} только с этими классами. Или один воздерживается единообразная инициализация вообще. Это похоже на большой «Гоча». Но может быть преимущества к нему, что я не в курсе. Edit: этот код: #include #include INT основной () {станд :: вектор а {2}; для авто (х: а) {станд :: соиЬ
Robert Mason
12

голосов
3

ответ
564

Просмотры

А = {} и {} -Style инициализация то же самое в C ++ 11?

C ++ 11, введенные {}. -Style инициализации Но эти две формы Т х {...}; Т х = {...}; тот же самый?
3

голосов
2

ответ
219

Просмотры

В классе инициализация элемента со списком инициализации с помощью единообразного синтаксиса инициализации? [Дубликат]

Этот вопрос уже есть ответ здесь: C ++ 11 в инициализации класса для не статического члена данных 1 ответа Я пытаюсь скомпилировать следующий с MSVC2013: классом SomeClass {структуры SomeStruct {BOOL а, б, в; }; SomeStruct сс {ложь, ложь, ложь}; } Компилятор дает мне следующую ошибку: SomeClass :: SomeStruct :: SomeStruct: нет перегруженная функция принимает 3 аргумента. Если изменить код следующим образом: класс SomeClass {STRUCT SomeStruct {BOOL а, б, в; }; SomeStruct сс {{ложь, ложь, ложь}}; } Программа компилируется и работает нормально. Является ли это проблемой с компилятором, или я не понимаю синтаксис? Из того, что я читал, то первый вариант должен компилировать.
Dan Nestor
2

голосов
5

ответ
138

Просмотры

Конструкторы и преобразование

C ++ Я читал, что конструкторы без явного ключевого слова и с одним параметром (или одним аргументом вызова к CTOR с несколькими параметрами, в которых все, кроме одного, имеют значения по умолчанию) может выполнить одно неявное преобразование. Учитывая два класса, где т е р Foo имеет два параметра Int и т х р Bar имеют два параметра Foo, это утверждение кажется, подразумевает вызов CTOR Бара с двумя неквалифицированными наборами Интса не должен переводить в вызов CTOR Бара с двумя Foo-х. Тогда, почему же скомпилировать следующий? структура Foo {Foo (INT X_, Int у-): х (X_), у (у-) {} INT х; Int у; }; Бар структура {Бар (Foo ПЕРВАЯ_СТРАНИЦА, Foo second_): первая (ПЕРВАЯ_СТРАНИЦА), второй (second_) {} Foo первым; Foo второй; }; # include INT основных () {Bar B = {{1, 2}, {3, 4}}; станд :: соиЬ
CodeBricks
2

голосов
1

ответ
118

Просмотры

Макро / рядной функция обход для отсутствующих равномерных инициализаторов в MSVC10 / 11

Есть полупрозрачный способ, что бы сделать его проще код в стиле, подобном тому, что можно было бы сделать с равномерными инициализаторами, без использования фактической функции? Я готов отказаться от безопасности типа и других ограничений однородных инициализаторов (я буду проверять их обоснованность с другими компиляторами), но я не хочу отказываться от хороших заявлений, как возвращение { «Foo», «бар»} ; установить my_strings = {string_a, string_b}; Макрос превращает их в совместимый код для неравномерного инициализатора, способных составителей бы весьма полезного для меня.
rubenvb
30

голосов
3

ответ
4.5k

Просмотры

Почему я не могу инициализировать ссылку в списке инициализатора с равномерной инициализации?

То есть, почему это: структура S {}; структура Т {T (S & S): S {S} {} S & s; }; INT основных () {S с; T T {s}; } Дает мне ошибку компиляции с GCC 4.7: test.cpp: В 'конструктора T :: T (S &)': test.cpp: 5: 18: ошибка: недопустимый инициализация неконстантного ссылки типа 'S &' из Rvalue типа «»? Чтобы исправить эту ошибку, я должен изменить S {S} к с (ы). Разве это не разорвать, ERM, однородность равномерной инициализации? EDIT: Я пытался с грохотом и лязгом принимает его, так что, возможно, это ошибка GCC?
HighCommander4
4

голосов
2

ответ
3.6k

Просмотры

C ++ 11 равномерная инициализации: Поле инициализатор не является постоянной

Я пытаюсь создать экземпляр набора строк, как это: класс POI {общественности: ... статического сопзЬ зЬй :: Типы наборов { «ресторан», «образование», «финансовый», «здоровье», «культура», " Другой" }; ...} Теперь, когда я делаю это я получаю эти ошибки (все на этой линии): ошибка: поле инициализатора не является постоянной статической сопзЬ станд :: Типы наборов { «ресторан», «образование», «финансовый», «здоровье », "культура", "другой"}; Ошибка: в классе инициализации статического элемента данных «сопзЬ STD :: набор POI :: ВИДОВ» ошибок небуквального типа: непостоянная в классе инициализации недопустимых для статического элемента «POI :: Types» Ошибка: (ые из от требуется инициализация класса) ошибка: «POI :: ВИДЫ» не может быть инициализированы непостоянным выражением, когда объявляемым Это имело бы смысл мне в глаза, если я предположил, что строки внутри набора, не рассматриваются как Уста. Это действительно проблема здесь? К сожалению, я не могу найти способ объявить эти строки внутри инициализатора константные .. Возможно ли это?
Lukas Barth
6

голосов
1

ответ
473

Просмотры

Simple program using uniform initialization to construct an object fails to compile

Consider the following program: struct X { X(int, int) { } X(X&&) { } }; int main() { X x( {0, 1} ); // Doesn't compile on ICC 13.0.1, compiles on // Clang 3.2, GCC 4.7.2, and GCC 4.8.0 beta. } When compiled with GCC 4.7.2, GCC 4.8.0, and Clang 3.2, this program does the following (*): Constructs a temporary of type X passing values 0 and 1 to the constructor, then; Move-constructs X from that temporary. With ICC 13.0.1, instead, it doesn't compile. QUESTION #1: Who is right? (*) Actually, the creation of the temporary and the call to the move constructor are elided, but compiling with the -fno-elide-constructors option and adding some printouts to the constructors reveals that this is what is going on. Now consider the following, slight variation of the above program, where uniform initialization is used to direct-initialize x: int main() { X x{ {0, 1} }; // ERROR! Doesn't compile. // ^........^ } I would not expect the use of braces instead of parentheses to change anything here, but it somehow does: this program doesn't compile on any of the compilers I've tested it on (Clang 3.2, GCC 4.7.2, GCC 4.8.0 beta, and ICC 13.0.1). QUESTION #2: Why?
Andy Prowl
3

голосов
2

ответ
147

Просмотры

Почему GCC предупреждает о сужая конверсии только для равномерной инициализации?

Я пытаюсь преобразовать длинную переменную типа в переменную типа INT с равномерной инициализации и без него. Но я получаю предупреждение компилятора только с равномерной инициализации. Это почему? Почему не Gcc предупреждают в обоих случаях? Я попытался с лязгом также и получили аналогичные результаты. Это код #include INT Основной () {длиной L = 1; INT I1 = л; INT i2 = {л}; станд :: соиЬ
ks1322
5

голосов
1

ответ
466

Просмотры

Равномерный инициализатор используется в рассуждениях по умолчанию для константной ссылки

Законно ли это с ++ синтаксис 0x? класс А {общественность: недействительный some_function (Const станда :: установить и опцию = {}); // обратите внимание, что это законно, которая связывает константную ссылку на временную: ничтожную some_function (Const станда :: установить и опцию = станд :: набор ()); } Потому что если это так, я нашел ошибку в GCC 4.6. Ошибки я получаю: ошибка: ожидается, первичное-выражение перед «{» маркер, который ... логично ... если бы это было незаконно. UPDATE: Как показан @Kerrek, это кровоточит в обычном C ++ 03, с агрегатами и старым синтаксисом инициализации скобки для них. Почему это не возможно? Является ли это запрещено в стандарте? Или компиляторы Виновные? Или это упущение? Я не вижу каких-либо серьезных проблем в разрешении этого в качестве альтернативы явным вызовом конструктора.
rubenvb
2

голосов
2

ответ
1.1k

Просмотры

Почему я получаю сообщение об ошибке C2797 в этом примере?

У меня есть следующий код: структура X {Int а, б; }; класс У {общественности: Y (X & Const х): X_ {х} {}; // ошибка C2797 частное: X x_; }; Собран с MSVC2013 Update 3, он жалуется на ошибки C2797. Если я заменить фигурные скобки с скобками (т.е. x_ (х)) программа успешно компилируется. Почему это происходит? Является ли этот компилятор поведение C ++ 11-совместимый? Как насчет C ++ 14? Edit: Для того, чтобы быть более ясным, я не уверен, что если X_ {х} выше следует, в соответствии со стандартом, называют X (станд :: initializer_list) или, если это допустимый синтаксис для вызова X (константный X &). Насколько я знаю, это последнее. Я прав?
Dan Nestor
1

голосов
3

ответ
171

Просмотры

Что такое C ++ C11 синтаксис: «= {}»?

Я наткнулся на этот синтаксис в C ++ файле: Obj OBJ = {}; Что оно делает? Есть ли просто вызвать конструктор по умолчанию?
7

голосов
1

ответ
624

Просмотры

uniform initialization of static constexpr member

According to: constexpr static data member giving undefined reference error static constexpr class members must meet two requirements: template struct wrapper { static constexpr Tp value{}; // 1 }; template constexpr Tp wrapper::value; // 2 struct foo { }; int main() { auto const& x = wrapper::value; (void)x; } Initialized inside the class definition (because it is constexpr) Defined outside the class definition (because it is static) If I change 1. to uniform initialization template struct wrapper { static constexpr auto value = Tp{}; // uniform initialization }; template constexpr Tp wrapper::value; compiler complains about conflicting declarations: $ g++ prog.cc -Wall -Wextra -std=c++1z -pedantic prog.cc:7:31: error: conflicting declaration 'constexpr const Tp wrapper::value' constexpr Tp wrapper::value; prog.cc:3:29: note: previous declaration as 'constexpr const auto wrapper::value' static constexpr auto value = Tp{}; and also about missing initializer: prog.cc:7:31: error: declaration of 'constexpr const auto wrapper::value' has no initializer Removing conflicting 2. definition ends, as expected, with linker error: In function `main': prog.cc:(.text+0x8): undefined reference to `wrapper::value' Code example online. Is it possible/legal to use uniform initialization for static constexpr class members?
Karol Wozniak
3

голосов
2

ответ
177

Просмотры

Как «уменьшить печатая для создания типов C ++» с Едиными Инициализаторами?

Я много играл новый унифицированный Низкоур.инициализ с {}. Как это: вектор х = {1,2,3,4}; карта GetMap () {возвращение {{1, "привет"}, {2, "вы"}}; } Это бесспорно, что эта инициализация может измениться программирует C ++. Но мне интересно, если я пропустил некоторые из волшебных возможностей при чтении вопрос Alfonses находится в Herb Sutter часто задаваемые вопросы. Альфонс: Унифицированная инициализация (использование {} для вызова конструктора, когда тип строящейся можно вывести) имеет потенциал, чтобы радикально уменьшить количество печатая необходимо для создания типов C ++. Это такие вещи, как лямбды, что будет меняться, как люди пишут C ++ код. [...] Может кто-нибудь дать мне пример того, что Альфонс точно предвидит здесь?
towi
2

голосов
1

ответ
301

Просмотры

Равномерная инициализация с троичным оператором возвратом из функции

Я не знаю, если это ошибка компилятора (GCC 4.8 на Arch Linux) или проблема со стандартом, но ниже код не компилировать. Почему getFoo1 допускается, но не getFoo2? структура Foo {INT _i; Foo (INT I): _ я (я) {}}; Foo getFoo1 (интермедиат я) {если (я == 3) {возвращение {г + 2}; } Еще {возвращение {г}; }} Foo getFoo2 (интермедиат я) {возвращение я == 3? {Я + 2}: {Я}; } INT основных () {автоматического foo1 = getFoo1 (3); // окей авто foo2 = getFoo2 (3); // упс вернуть 0; }
Átila Neves
3

голосов
3

ответ
312

Просмотры

равномерная инициализация для динамических объектов

#include структура Foo {станд :: unique_ptr р; }; INT основных () {Foo бар {станд :: unique_ptr (новый INT (42))}; // нормально новый Foo {станд :: unique_ptr (новый INT (42))}; // ошибка: нет функции соответствия для вызова не // «Foo :: Foo ()»} ли равномерная инициализация не работает с динамическими объектами, или это недостаток г ++ 4.6.1? Он работает с г ++ 4.7.1, но обе линии в основном не компилируется, если Foo наследует от другого класса: структура БАЗА {// нет членов данных, только некоторые функции членов}; структура Foo: Баз {станд :: unique_ptr р; }; Опять же, недостаток моего компилятора? Или равномерная инициализация не играть хорошо с наследованием?
fredoverflow
6

голосов
2

ответ
580

Просмотры

Активный член союза, равномерная инициализация и конструкторы

В качестве (рабочий проект) говорит, C ++, стандарт: 9.5.1 [class.union] В союзе, в лучшем случае один из нестатических членов данных может быть активным в любой момент времени, то есть, значение не более одного из не-статические данные могут храниться в союзе в любое время. [...] Размер союза является достаточным, чтобы содержать самый большой из своих нестатические элементов данных. Каждый не-статический член данных выделяются, как если бы он был единственным членом структуры. Все не статические данные из объекта союза имеет один и тот же адрес. Но я не знаю, как определить, что является активным членом профсоюза, и я не использовал достаточно, чтобы погрузиться в стандарт, чтобы найти то, что стандарт говорит об этом, я пытался понять, как выставиться активный член но я нашел, как он сменил: 9.5.4 [class.union] [Примечание: В общем, необходимо использовать явные вызовы деструктора и размещение новых операторы для изменения активного члена союза. -end примечание] [Пример: Рассмотрим объект у того или иного типа союза U, имеющие не-статические данные м типа М и п типа N. Если М имеет нетривиальный деструктор и Н имеет нетривиальный конструктор (для Например, если они объявляют или наследовать виртуальные функции), активный член и может быть безопасно переключается с м п с использованием нового оператора деструктора и размещения следующим образом: ит ~ М (); новый (& u.n) Н; -end пример] Так что я думаю, что активный членом союза является один первый asigned, используется, построенные или места размещения new'ed; но это становится сложнее вид с равномерной инициализации, рассмотрим следующий код: Union Foo {{Char-структуру а, б, в, г;}; массив символов [4]; INT целое число; }; Foo е; // по умолчанию станд т е р :: соиЬ -end примечание] [Пример: Рассмотрим объект у того или иного типа союза U, имеющие не-статические данные м типа М и п типа N. Если М имеет нетривиальный деструктор и Н имеет нетривиальный конструктор (для Например, если они объявляют или наследовать виртуальные функции), активный член и может быть безопасно переключается с м п с использованием нового оператора деструктора и размещения следующим образом: ит ~ М (); новый (& u.n) Н; -end пример] Так что я думаю, что активный членом союза является один первый asigned, используется, построенные или места размещения new'ed; но это становится сложнее вид с равномерной инициализации, рассмотрим следующий код: Union Foo {{Char-структуру а, б, в, г;}; массив символов [4]; INT целое число; }; Foo е; // по умолчанию станд т е р :: соиЬ -end примечание] [Пример: Рассмотрим объект у того или иного типа союза U, имеющие не-статические данные м типа М и п типа N. Если М имеет нетривиальный деструктор и Н имеет нетривиальный конструктор (для Например, если они объявляют или наследовать виртуальные функции), активный член и может быть безопасно переключается с м п с использованием нового оператора деструктора и размещения следующим образом: ит ~ М (); новый (& u.n) Н; -end пример] Так что я думаю, что активный членом союза является один первый asigned, используется, построенные или места размещения new'ed; но это становится сложнее вид с равномерной инициализации, рассмотрим следующий код: Union Foo {{Char-структуру а, б, в, г;}; массив символов [4]; INT целое число; }; Foo е; // по умолчанию станд т е р :: соиЬ Если М имеет нетривиальный деструктор и Н имеет нетривиальный конструктор (например, если они объявляют или наследовать виртуальные функции), активный член и может быть безопасно переключаться от т до п с использованием деструктора и размещением нового оператора как следующим образом: ит ~ М (); новый (& u.n) Н; -end пример] Так что я думаю, что активный членом союза является один первый asigned, используется, построенные или места размещения new'ed; но это становится сложнее вид с равномерной инициализации, рассмотрим следующий код: Union Foo {{Char-структуру а, б, в, г;}; массив символов [4]; INT целое число; }; Foo е; // по умолчанию станд т е р :: соиЬ Если М имеет нетривиальный деструктор и Н имеет нетривиальный конструктор (например, если они объявляют или наследовать виртуальные функции), активный член и может быть безопасно переключаться от т до п с использованием деструктора и размещением нового оператора как следующим образом: ит ~ М (); новый (& u.n) Н; -end пример] Так что я думаю, что активный членом союза является один первый asigned, используется, построенные или места размещения new'ed; но это становится сложнее вид с равномерной инициализации, рассмотрим следующий код: Union Foo {{Char-структуру а, б, в, г;}; массив символов [4]; INT целое число; }; Foo е; // по умолчанию станд т е р :: соиЬ новый (& u.n) Н; -end пример] Так что я думаю, что активный членом союза является один первый asigned, используется, построенные или места размещения new'ed; но это становится сложнее вид с равномерной инициализации, рассмотрим следующий код: Union Foo {{Char-структуру а, б, в, г;}; массив символов [4]; INT целое число; }; Foo е; // по умолчанию станд т е р :: соиЬ новый (& u.n) Н; -end пример] Так что я думаю, что активный членом союза является один первый asigned, используется, построенные или места размещения new'ed; но это становится сложнее вид с равномерной инициализации, рассмотрим следующий код: Union Foo {{Char-структуру а, б, в, г;}; массив символов [4]; INT целое число; }; Foo е; // по умолчанию станд т е р :: соиЬ
Paula_plus_plus
1

голосов
1

ответ
126

Просмотры

Пользовательские скобки инициализатор

Скажем, у меня есть эта структура: STRUCT MyStruct {INT field1; символ * field2; MyStruct (Int А, символ * б): поле2 (б) {поле1 = DoStuff (а); } MyStruct (интермедиат а): MyStruct (а, nullptr) {} ~ MyStruct (); } Насколько я знаю, это не совокупность, как у меня есть несколько конструкторов. То, что я хочу добиться того, чтобы использовать фигурные скобки инициализатор в пользовательском пути, что означает, используя такой код: MyStruct х = {1, «строка»}; который неявно вызывает правильный конструктор (первый в этом случае). Возможно ли это каким-либо образом?
Fylax

Просмотр дополнительных вопросов