2012-08-03 34 views
6

Trong C++ người ta không thể dựa vào constructor sao chép được gọi từ câu lệnh return vì một mệnh đề đặc biệt trong tiêu chuẩn cho phép trình biên dịch bỏ qua một lời gọi đến hàm tạo bản sao. câu lệnh return, ngay cả khi hàm tạo bản sao có các tác dụng phụ. Vì vậy, nó là phong cách xấu để viết một constructor sao chép mà làm cái gì khác hơn là chỉ cần sao chép xây dựng dụ. Có các câu lệnh tương tự trong tiêu chuẩn C++ 11 cho phép trình biên dịch loại bỏ một cuộc gọi đến nhà xây dựng di chuyển trong một số trường hợp nhất định - và nếu có, thì những trường hợp đó là gì?C++ 11 di chuyển constructor với các hiệu ứng phụ

+0

Cảm ơn. Câu hỏi được trả lời đầy đủ. Đã học rất nhiều hôm nay! Đầu tiên (một vài giây) là @Xeo. Đó sẽ là câu trả lời đúng. Tất cả câu trả lời +1 – ritter

Trả lời

9

Bản sao chỉ áp dụng như nhau để di chuyển xây dựng, đó là cùng một mệnh đề chính xác và cả việc cắt bỏ bản sao và xây dựng di chuyển được gọi chung là "copy-elision".

§12.8 [class.copy] p31

Khi tiêu chí nhất định được đáp ứng, một thực hiện được phép bỏ qua việc xây dựng bản sao/di chuyển của một đối tượng lớp, ngay cả khi các nhà xây dựng bản sao/di chuyển và/hoặc destructor cho đối tượng có tác dụng phụ. [...]

3

Khi cho phép sao chép bản sao, sẽ không có sao chép nào được thực hiện, vì vậy sẽ không có cuộc gọi đến hàm khởi động sao chép, ngay cả khi đối tượng có thể di chuyển được. Vì vậy, sao chép elision thắng hơn di chuyển, và bạn không thể chắc chắn (ít nhất là không phải trong một cách di động) khi nó sẽ diễn ra. Vì vậy, đây là một kịch bản khi tác dụng phụ trên xây dựng bản sao di chuyển sẽ là một ý tưởng tồi.

1

Elision được xác định giống hệt nhau cho cả bản sao và di chuyển. Tiêu chuẩn không có bất kỳ từ ngữ cụ thể nào để di chuyển, vì chúng được định nghĩa giống nhau.

Các vấn đề liên quan