Возможный дубликат:
initializer_list и семантика перемещения
В этом коде:
#include <vector>
#include <initializer_list>
template<typename T>
class some_custom_container : public std::vector<T>
{
public:
some_custom_container(const std::initializer_list<T>& contents)
{
for (auto& i : contents)
this->emplace_back(std::move(i));
}
};
class test_class
{};
int main()
{
test_class a;
some_custom_container<test_class> i = { a, test_class(), a };
}
Насколько я понимаю, все объекты в { a, test_class(), a }
построены безопасно: именованные объекты копируются, а неименованные объекты перемещаются для создания списка initializer_list. После этого этот initializer_list
передается по ссылке конструктору some_custom_container
.
Затем, чтобы избежать бесполезных двойных копий, я перемещаю их все, чтобы заполнить вектор.
Безопасен ли этот конструктор? Я имею в виду, что в странной ситуации, например, если T оценивается как ссылка & или &&, всегда ли вектор хорошо заполнен (содержит безопасные объекты)?
Если это так, то почему реализации конструктора initializer_list
контейнеров stl не реализованы таким образом? Насколько я знаю, их конструкторы копируют, а не перемещают содержимое.