thể trùng lặp:
initializer_list and move semanticsCó an toàn khi di chuyển các phần tử của danh sách khởi tạo không?
Trong mã này:
#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 };
}
Nếu tôi đã hiểu nó, tất cả các đối tượng trong { a, test_class(), a }
được an toàn-xây dựng: các named- các đối tượng được sao chép và các đối tượng chưa được đặt tên được di chuyển để xây dựng initializer_list. Sau đó, initializer_list
này được chuyển bằng tham chiếu đến hàm tạo của some_custom_container
.
Sau đó, để tránh những bản sao vô dụng, tôi di chuyển tất cả chúng để điền vào vectơ.
Nhà xây dựng này có an toàn không? Tôi có nghĩa là, trong một tình huống kỳ lạ, ví dụ nếu T được đánh giá là một tham chiếu & hoặc & &, là vectơ luôn luôn chứa đầy (có chứa các đối tượng an toàn) không?
Nếu trường hợp này xảy ra, tại sao việc triển khai thực hiện các công cụ xây dựng initializer_list
của các vùng chứa stl không được triển khai theo cách này? Như tôi biết, các nhà xây dựng của họ sao chép và không di chuyển nội dung.
Nó thậm chí không biên dịch bởi vì danh sách trình khởi tạo chỉ cung cấp quyền truy cập const vào nội dung của chúng và bạn không thể di chuyển từ tham chiếu đến const. Xem thêm: http://stackoverflow.com/questions/8468774/can-i-list-initialize-a-vector-of-move-only-type –
Điều đó sẽ không ngăn nó biên dịch, chỉ di chuyển. Trình tạo bản sao sẽ được gọi. – Puppy