thể trùng lặp:
What’s the motivation behind having copy and direct initialization behave differently?Tại sao bản sao khởi tạo theo cách đó? Tại sao yêu cầu các nhà xây dựng bản sao?
Và bằng cách sao chép khởi, ý tôi là như vậy:
struct MyStruct
{
MyStruct(int) {}
MyStruct(const MyStruct&) {}
};
MyStruct s = 5; // needs *both* the int and copy constructor
Mặc dù lập trình trong C++ trong nhiều năm qua, tôi không bao giờ nhận ra đoạn mã trên yêu cầu các nhà xây dựng bản sao (nhờ jogojapan). Tạm thời luôn luôn được elided, và như vậy tôi thậm chí không bao giờ biết nó thậm chí còn tồn tại (ít nhất là trên một bề ngoài cấp, mặc dù nó được tối ưu hóa đi) cho đến khi nó đã được chỉ ra cho tôi.
Sau một số lượng khá googling, tôi có ý tưởng về cách hoạt động của nó. Câu hỏi của tôi là lý do tại sao là nó như vậy?
Tại sao tiêu chuẩn không làm cho ví dụ trên không cần hàm sao chép? Có một số trường hợp cụ thể/ví dụ cho thấy rằng yêu cầu các nhà xây dựng bản sao trong loại hình khởi tạo là quan trọng?
Nếu không có giải thích hợp lý về lý do tại sao chúng là gì, tôi chỉ xem đây là một tạo tác gây phiền nhiễu, nhưng tôi không muốn không biết nếu có điều gì đó quan trọng mà tôi đang thiếu.
Có vẻ như cần xây dựng sao chép cho việc đặt tên; thực sự nó [không được gọi] (http://ideone.com/35fjAD). – iammilind
@iammilind: Nó không cần được gọi là do ** Copy elision **, nhưng constructor sao chép cần phải được truy cập. Về cơ bản, nó có nghĩa là tiêu chuẩn * cho phép * copy constructor được gọi và nó ** phải ** có sẵn. Tối ưu hóa không phải là tiêu chuẩn đảm bảo infact của nó trái ngược với tiêu chuẩn cho. –
@JesseGood: Cảm ơn vì điều đó. Có vẻ như đây là một bản sao khá nhiều. Loại thất vọng không có câu trả lời hay cho câu hỏi khác ... – Cornstalks