2017-02-24 13 views
7
#include <vector> 

using namespace std; 

struct A 
{ 
    A(const vector<int>&) {} 
    A(vector<int>&&) {} 
}; 

A f() 
{ 
    vector<int> coll; 
    return A{ coll }; // Which constructor of A will be called as per C++11? 
} 

int main() 
{ 
    f(); 
} 

coll an xvalue trong return A{ coll };?C++ 11 có đảm bảo biến cục bộ trong câu lệnh trả về sẽ được di chuyển thay vì sao chép không?

Đảm bảo C++ 11 A(vector<int>&&) sẽ được gọi khi f trả về?

+0

Trong ví dụ của bạn, 'A {coll}' sẽ được xây dựng trong ngữ cảnh người gọi và sẽ sử dụng hàm tạo 'A (const vector &)'. – Oliv

Trả lời

11

C++ 11 không cho phép di chuyển từ coll. Nó chỉ cho phép di chuyển ngầm trong câu lệnh return khi bạn làm return <identifier>, trong đó <identifier> là tên của biến cục bộ. Bất kỳ biểu hiện phức tạp hơn sẽ không di chuyển ngầm.

Và các biểu thức phức tạp hơn số đó sẽ không trải qua mọi hình thức cắt bỏ.

+4

+1; Lưu ý rằng ở đó có các quirks, ở đây nếu loại '' không khớp với loại trả về, nó không được di chuyển. Điều này đã được sửa trong một báo cáo lỗi hoặc một sự thay đổi trong C++ 14, tôi quên nó; nhưng, nếu bạn đang sử dụng một trình biên dịch kế thừa (hoặc rủi ro bằng cách sử dụng một), một 'di chuyển' khi các loại không khớp chính xác có thể là khôn ngoan (và không có chi phí). Trong khi đó, khi các loại khớp chính xác, 'di chuyển' sẽ chặn bỏ đi. Đây chỉ là mối quan tâm nếu bạn đang sử dụng trình biên dịch tương đối cổ đại. – Yakk

+0

@ vsoftco: Ồ, biểu thức * là một giá trị, và nó sẽ hoạt động như vậy. Nhưng 'coll' sẽ không được chuyển sang' A', và đó là câu hỏi đang hỏi. –

+0

@NicolBolas Xin cảm ơn! Vâng, nhận ra sau khi tôi viết bình luận. Lúc đầu, tôi nghĩ rằng 'A' có một ctor di chuyển và câu hỏi đó là về chính đối tượng 'A'. – vsoftco

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