Защо достъпът до std::initializer_list
не ни позволява да променяме съдържанието му? Това е голям недостатък на std::initializer_list
, когато се използва за основната му цел (да инициализира контейнер), тъй като използването му води до прекомерно копиране-конструкция/копиране-присвояване, вместо преместване-конструкция/преместване-присвояване.
#include <initializer_list>
#include <iostream>
#include <vector>
#include <cstdlib>
struct A
{
A() = default;
A(A const &) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
A(A &&) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
A & operator = (A const &) { std::cout << __PRETTY_FUNCTION__ << std::endl; return *this; }
A & operator = (A &&) { std::cout << __PRETTY_FUNCTION__ << std::endl; return *this; }
};
int
main()
{
std::vector< A >{A{}, A{}, A{}};
return EXIT_SUCCESS;
}
Резултат (както се очаква):
A::A(const A &)
A::A(const A &)
A::A(const A &)
Защо неговият дизайн е толкова ограничен?
{A{}, A{}, A{}}
конструира цялото съдържание на списъка с инициализатор на място. - person Tomilov Anatoliy   schedule 28.11.2014std::initializer_list
за инициализиране на контейнери на обекти, които не могат да се копират. - person Tomilov Anatoliy   schedule 30.11.2014