Trước C++ 11, chúng ta có thể thực hiện khởi tạo sao chép bằng cách viết một cái gì đó như A a = 1;
tương đương hoặc ít hơn tương đương với A a = A(1);
. Tức là, một tạm thời được tạo ra đầu tiên và sau đó một ctor sao chép được gọi ra. Bất kể việc sao chép bản sao, điều này phải rất khái niệm và ctor sao chép phải có thể truy cập được.Sao chép danh sách sao chép có gọi ra bản sao ctor không?
Với khởi tạo danh sách trong C++ 11, chúng tôi có thể thực hiện khởi tạo danh sách sao chép bằng cách viết A a = {1, 2};
. Theo ý kiến của tôi, điều này ít nhiều sẽ tương đương với A a = A(1, 2);
. Tuy nhiên, trên GCC và clang, A a = {1, 2}
biên dịch ngay cả khi không thể truy cập được bản sao và di chuyển ctor (bằng cách khai báo là riêng tư). Tuy nhiên, A a = 1;
không biên dịch trên GCC hoặc clang nếu không thể truy cập được ctor sao chép/di chuyển tương ứng. Vì vậy, A a = {1, 2};
có vẻ nhiều hơn hoặc ít hơn tương đương với A a{1, 2};
là khởi tạo danh sách trực tiếp. Sự khác biệt giữa điều này và khởi tạo danh sách trực tiếp thực sự là A a = {1, 2};
không biên dịch nếu ctor có hai int là rõ ràng. Trong khía cạnh này, A a = {1, 2};
giống với khởi tạo sao chép.
Vì vậy, câu hỏi của tôi là: ngữ nghĩa chính xác của các biểu thức như A a = {1, 2};
là khái niệm gì? Bằng cách khái niệm, sao chép elision không ở lại trong cách.
Bạn đã tự giải thích mọi thứ trong câu hỏi. Sao chép danh sách khởi tạo giống như khởi tạo danh sách trực tiếp trừ trường hợp trước đây không xem xét các hàm tạo rõ ràng. Không yêu cầu hàm tạo bản sao có thể truy cập. – Praetorian
@Praetorian Điều này có vẻ không chính xác như thế này. Xem bình luận của tôi cho câu trả lời của Columbo. – Lingxi