EDIT:. Прежде чем мы начнем, этот вопрос не касается правильного использования std::initializer_list
; это то, что должно быть принято, когда требуется удобный синтаксис. Спасибо, что остался на тему.
С++ 11 вводит std::initializer_list
для определения функций, принимающих аргументы braced-init-list.
struct bar {
bar( char const * );
bar( int );
} dog( 42 );
fn foo( std::initializer_list< bar > args );
foo( { "blah", 3, dog } );
Синтаксис хорош, но под капотом это неприятно из-за различных проблем:
-
Они не могут быть значимо перемещены. Вышеупомянутая функция должна скопировать
dog
из списка; это не может быть преобразовано в операцию перемещения или отклонено. Типы Move-only не могут использоваться вообще. (Ну,const_cast
действительно будет допустимым обходным путем. Если есть статья об этом, я бы хотел его увидеть.) -
Нет семантики
constexpr
. (Это ожидается в С++ 1y. Это небольшая проблема.) -
const
не распространяется, как и везде;initializer_list
никогда неconst
, но его содержимое всегда есть. (Поскольку он не владеет своим содержимым, он не может предоставить доступ для записи к копии, хотя копирование в любом месте редко будет безопасным.) -
Объект
initializer_list
не имеет своего хранилища (yikes); его связь с полностью раздельным голой матрицей (yikes), обеспечивающая хранение, является неопределенным (yikes) как отношение ссылки на связанный временной (четверные yikes).
Я верю, что все это будет исправлено в свое время, но на данный момент существует лучшая практика для получения преимуществ без жесткого кодирования до initializer_list
? Существует ли какая-либо литература или анализ в отношении непосредственной зависимости от нее?
Очевидным решением является передача по значению стандартного контейнера, такого как std::vector
. Как только объекты будут скопированы в него из initializer_list
, он будет создан для перемещения по значению, а затем вы можете переместить содержимое. Улучшение будет заключаться в том, чтобы предложить хранилище в стеке. Хорошая библиотека может предложить большинство преимуществ initializer_list
, array
и vector
, даже не используя первый.
Любые ресурсы?