Как ввести поддержку агрегатной инициализации для их правильного построения в (например) контейнерах STL? Я имею в виду что-то вроде:
struct A { int i; char c; };
std::list< A > l; // empty
l.insert(std::memberwise, 1, '2');
// <=> l.insert({1, '2'});
std::memberwise
— возможный тег, подобный уже существующим в STL std::piecewise_construct
, std::allocator_arg
и т. д.
Теоретически возможно ли расширять контейнеры STL таким образом? Есть ли лучший способ (STL-способ) сделать это? Как это может выглядеть?
Вопрос о дизайне интерфейса и о возможности (внутренней) реализации (не детали).
Я уверен, что контейнеры используют что-то вроде ::new (static_cast< void * >(pstorage) value_type(std::forward< Args >(args)...);
внутри. Я уверен, что замена скобок фигурными скобками приведет к серьезным изменениям. Из-за отсутствия сужения, т.е.
КРОМЕ ТОГО
Как правило, l.insert({1, '2'});
, упомянутые в комментариях, могут привести к чрезмерному перемещению value_type
. Весьма вероятно, что этот шаг был бы оптимизирован любым современным компилятором, но в любом случае есть лишние фигурные скобки.
l.insert({1, '2'});
работает на С++ 11. - person Chad   schedule 29.12.2016l.emplace{,_back}(1, '2');
- нет. - person Tomilov Anatoliy   schedule 29.12.2016emplace
илиemplace_back
через агрегатную инициализацию, он фактически создает объект, а затем копирует его в структуру. - person RyanP   schedule 29.12.2016std::is_aggregate
для обнаружения агрегатов, чтобы поместить их в агрегатную оболочку. - person Tomilov Anatoliy   schedule 29.12.2016