Giả sử chúng tôi có một lớp học Foo
với một nhà xây dựng không phải là explicit
từ một số int
. Sau đó, cho các chức năng sau:Xây dựng trong báo cáo trả lại
Foo makeFoo1() { return 123; }
Foo makeFoo2() { return {123}; }
Tôi nghĩ makeFoo1
đòi hỏi Foo
's sao chép/di chuyển ctor có thể truy cập, và đó là thể (mặc dù không chắc) mà trình biên dịch không bõ mẫu âm chót sao chép và do đó kết quả trong một sao chép/di chuyển đúng.
Đối với makeFoo2
, vì chúng tôi đang sử dụng tính năng khởi tạo danh sách sao chép, không có bản sao/di chuyển nào có thể xảy ra.
Tôi có nên thực sự lo lắng về điều này và đặt các đối số cho các sốctors trong niềng răng bất cứ khi nào tôi có thể (như trong makeFoo2
)? (Nói nếu tôi là tác giả thư viện và mong muốn thư viện được sử dụng với các trình biên dịch phụ cho hệ thống nhúng.)
_ "Đối với makeFoo2, vì chúng tôi đang sử dụng sao chép danh sách-bản sao, không sao chép/di chuyển nào có thể xảy ra." _ [Thật sao?] (Http://stackoverflow.com/q/38043288/560648) –
Không, tuy nhiên makeFoo thứ hai có yêu cầu thấp hơn đối với lớp Foo (không có bản sao nào); do đó nó là tốt hơn. –
Bản sao nào bạn đang cố gắng bỏ trốn? Nếu bạn đang xây dựng từ một số nguyên, tôi sẽ không lo lắng về việc sao chép eliding một số nguyên như thế này sẽ phù hợp với một thanh ghi CPU. Đối với các đối tượng Foo, sẽ không được elided đã được bởi RVO? – Spacemoose