cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
90 stars 0 forks source link

std::initializer_list должен быть применим к move-only объектам #412

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +7, -0 Автор идеи: Евгений Гагауз

Легко продемонстрировать ограничение применимости класса std::initializer_list на простом примере инициализации вектора move-only объектов:

#include <vector>

struct MoveOnly {
    MoveOnly() = default;
    MoveOnly(MoveOnly&&) = default;
};

std::vector<MoveOnly> vec = {MoveOnly()};
apolukhin commented 3 years ago

Евгений Гагауз, 28 февраля 2019, 9:24 Забыл отметить, что пример выше вызывает ошибку компиляции.

amlet, 28 февраля 2019, 11:35 Нужно всего-то во всех стандартных контейнерах вместо:

constructor(std::initializer_list<T> list);

использовать (и реализовать)

constructor(const std::initializer_list<T> & list);
constructor(std::initializer_list<T> && list);

Это даже вроде ничего поломать не должно :)

Andrey Davydov, 28 февраля 2019, 12:58 Было бы здорово, если бы initializer_list изначально поддерживал move semantics, но поправить это задним числом вряд ли возможно. Есть такие идеи: https://wg21.link/n4166, https://wg21.tartanllama.xyz/initializer_list.