Я знаю, что попытка использовать std::initializer_list<NonCopyable>
приводит к ошибке, потому что элементы копируются во временный массив, представленный initializer_list
.Я также прочитал некоторые объяснения, почему было бы неправильно иметь в списке ссылки на rvalue, с которыми я согласен.
Проблема в том, что я хотел бы передавать не копируемые вещи, а не двигатьсяиз них, но только const
- доступ к ним, поэтому аргумент о значениях не применим.Что я могу сделать, чтобы сохранить, если возможно, синтаксис инициализации списка и семантику ссылок (без оболочек, без необработанных указателей)?
NonCopyable a{...}, b{...};
ListInitialized c{a, b};
Я думаю, что здесь упущено что-то чрезвычайно очевидное.
Обновление:
Это работает (*),
ListInitialized(std::initializer_list<std::reference_wrapper<NonCopyable>>) {...}
, но не принимает значения.Было бы хорошо, если бы я мог просто передать список всего, что могло бы войти в const NonCopyable&
.
(*) Я знаю, что написал «без упаковщиков», но это не влияет ни на вызывающий код, ни наитерация по списку.