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

Евгений Гагауз
Евгений Гагауз

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

#include <vector>

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

std::vector<MoveOnly> vec = {MoveOnly()};

7
рейтинг
3 комментария
Евгений Гагауз

Забыл отметить, что пример выше вызывает ошибку компиляции.

Евгений Гагауз
amlet

Нужно всего-то во всех стандартных контейнерах вместо:

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

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

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

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

amlet
Andrey Davydov

Было бы здорово, если бы initializer_list изначально поддерживал move semantics, но поправить это задним числом вряд ли возможно. Есть такие идеи: wg21.link/n4166https://wg21.tartanllama.xyz/initializer_list.

Andrey Davydov
Обновлено 
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения