2013-02-25 41 views
5

Tôi có một chức năngdi chuyển ngữ nghĩa và struct

struct foo { 
    std::vector<int> v; 
}; 

foo func(); 

sẽ vector bên foo được di chuyển hoặc sao chép khi trở về từ chức năng?

+4

Không, nó sẽ được di chuyển. –

+2

Nó hoàn toàn phụ thuộc vào những gì xảy ra bên trong 'func'. –

+0

@BoPersson Không hoàn toàn, vì câu hỏi đó là về việc trả về một 'vector', trong khi đó là về việc trả về một cấu trúc với hàm khởi tạo mặc định và một thành viên' vector'. – delnan

Trả lời

5

Nó sẽ được chuyển. (*)

Vì bạn không cung cấp một constructor di chuyển rõ ràng cho lớp foo của bạn, trình biên dịch sẽ ngầm tạo ra một cho bạn để gọi constructor di chuyển (nếu có) cho tất cả các thành viên trong lớp của bạn. Vì std::vector định nghĩa một hàm tạo di chuyển, nó sẽ được gọi ra.

mỗi Đoạn 12,8/15 của C++ 11 Tiêu chuẩn:

Các ngầm định nghĩa sao chép/di chuyển constructor cho một lớp X phi công đoàn thực hiện một bản sao memberwise/di chuyển các căn cứ và các thành viên của nó . [...]

Cũng lưu ý rằng trình biên dịch được phép bỏ cuộc gọi đến trình tạo bản sao/di chuyển của lớp khi trả về một đối tượng theo giá trị. Tối ưu hóa này được gọi là (Named) Return Value Optimization.

(*) Tôi giả định rằng trường hợp sử dụng của bạn là tạo đối tượng địa phương có bộ nhớ tự động bên trong foo() và trả lại.

+0

Nó sẽ không được di chuyển nếu 'foo' nó trả về có lẽ là' foo' với thời gian lưu trữ tĩnh. Có lẽ có một số trường hợp khác nữa. Nhưng có, tôi đồng ý với bạn trong trường hợp người hỏi có thể hỏi về. –

+1

@sftrabbit: OK, đúng vậy. Tôi cho rằng anh ta muốn trả lại một đối tượng cục bộ với bộ nhớ tự động. Đã chỉnh sửa, cảm ơn bạn. –

+0

@BoPersson: Tôi đã đề cập đến điều đó, mặc dù không phải RVO rõ ràng. Tôi sẽ làm nó. –

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