Здравствуйте, andyp, Вы писали:
A>На сколько помню стандарт, у тебя проблемы еще на этапе создания std::initializer_list<item>. Там нужен копирующий конструктор.
Нет. В initializer_list элементы инициализируются in place.
Ошибка происходит тогда, когда вектор инициализируется initializer_list-ом.
A>Серия вызовов push_back({"aa"}) ????
Это да, но неудобно и уродливо же...
Re[3]: Инициализация вектора non-copyable элементами
Здравствуйте, Tasheehoo, Вы писали:
T>Здравствуйте, andyp, Вы писали:
A>>На сколько помню стандарт, у тебя проблемы еще на этапе создания std::initializer_list<item>. Там нужен копирующий конструктор. T>Нет. В initializer_list элементы инициализируются in place. T>Ошибка происходит тогда, когда вектор инициализируется initializer_list-ом.
Стандарт — 8.5.4:
An object of type std::initializer_list<E> is constructed from an initializer list as if the implementation
allocated a temporary array of N elements of type const E, where N is the number of elements in the
initializer list. Each element of that array is copy-initialized with the corresponding element of the initializer
list, and the std::initializer_list<E> object is constructed to refer to that array. [ Note: A constructor
or conversion function selected for the copy shall be accessible (Clause 11) in the context of the initializer
list. —end note ]
A>>Серия вызовов push_back({"aa"}) ???? T>Это да, но неудобно и уродливо же...
Re[4]: Инициализация вектора non-copyable элементами
Здравствуйте, andyp, Вы писали:
A>Стандарт — 8.5.4: A>
A>An object of type std::initializer_list<E> is constructed from an initializer list as if the implementation
A>allocated a temporary array of N elements of type const E, where N is the number of elements in the
A>initializer list. Each element of that array is copy-initialized with the corresponding element of the initializer
A>list, and the std::initializer_list<E> object is constructed to refer to that array. [ Note: A constructor
A>or conversion function selected for the copy shall be accessible (Clause 11) in the context of the initializer
A>list. —end note ]
Значит стандарт ошибается, т.к. этот код компилится, а согласно стадндарту — не должен:
std::initializer_list<item> il = {{""}, {""}};
Прошу обратить внимание на то, что item не имеет копирующего конструктора и присвающего оператора.
Re[4]: Инициализация вектора non-copyable элементами
A>>>На сколько помню стандарт, у тебя проблемы еще на этапе создания std::initializer_list<item>. Там нужен копирующий конструктор. T>>Нет. В initializer_list элементы инициализируются in place. T>>Ошибка происходит тогда, когда вектор инициализируется initializer_list-ом.
A>Стандарт — 8.5.4: A>
A>An object of type std::initializer_list<E> is constructed from an initializer list as if the implementation
A>allocated a temporary array of N elements of type const E, where N is the number of elements in the
A>initializer list. Each element of that array is copy-initialized with the corresponding element of the initializer
A>list, and the std::initializer_list<E> object is constructed to refer to that array. [ Note: A constructor
A>or conversion function selected for the copy shall be accessible (Clause 11) in the context of the initializer
A>list. —end note ]
Термин copy-initialized не означает, что непременно должен использоваться копирующий конструктор. Сойдёт и перемещающий. Так что приведённый пункт стандарта никоим образом не подкрепляет твоё утверждение:
A>>>На сколько помню стандарт, у тебя проблемы еще на этапе создания std::initializer_list<item>. Там нужен копирующий конструктор.
Нет, для создания initializer_list копирующий конструктор необязателен.
Здравствуйте, Tasheehoo, Вы писали:
T>Пытаюсь инициализировать вектор таких структур: T>Но компилятор говорит что нет копирующего конструктора: T>Оно и понятно, копирующий конструктор мне не нужен.
Тут важно то, что по стандарту initializer_list — это принципиально константный объект. Из него нельзя сделать перемещение, так как это может поменять содержимое initializer_list.
T>Но как быть?
Инициализируешь обычный c-style массив с помощью initializer_list — тут всё ок, копирование не нужно.
Инициализируешь vector этим массивом через std::make_move_iterator — тут теперь тоже копирование не нужно.
Примерно так:
Собственно, первое действие с инициализацией C-массива как раз и показывает компилятору, что тут вместо константного списка нужно получить элементы в неком контейнере из которого можно их будет переместить. Для красоты или удобства потом можно будет создание private_items загнать в какую-нибудь функцию чтобы наружу дополнительный массив не светить.
Здравствуйте, watchmaker, Вы писали:
W>Инициализируешь обычный c-style массив с помощью initializer_list — тут всё ок, копирование не нужно. W>Инициализируешь vector этим массивом через std::make_move_iterator — тут теперь тоже копирование не нужно. W>Примерно так:
Здравствуйте, watchmaker, Вы писали:
W>Термин copy-initialized не означает, что непременно должен использоваться копирующий конструктор. Сойдёт и перемещающий. Так что приведённый пункт стандарта никоим образом не подкрепляет твоё утверждение:
A>>>>На сколько помню стандарт, у тебя проблемы еще на этапе создания std::initializer_list<item>. Там нужен копирующий конструктор.
W>Нет, для создания initializer_list копирующий конструктор необязателен.
На счет "сойдет и перемещающий" ничего в стандарте не нашел . copy-initialize упоминается в контекстах, предполагающих копирование.
Re[5]: Инициализация вектора non-copyable элементами
Здравствуйте, B0FEE664, Вы писали:
BFE>Всё это очень хорошо, но мне осталось не понятно, зачем const std::vector, а не const std::array.
Правильный вопрос! А главное — вовремя!