Tôi biết rằng trong tình hình sau đó trình biên dịch được tự do di chuyển-xây dựng các giá trị trả về từ makeA
(nhưng cũng là miễn phí để bõ mẫu âm chót sao chép hoặc di chuyển hoàn toàn):Có thể trả về một biến cục bộ theo giá trị trong C++ 11/14 dẫn đến giá trị trả về đang được xây dựng bởi rvalue khi không có copy/move được tham gia?
struct A
{
A(A&);
A(A&&);
};
A makeA()
{
A localA;
return localA;
}
Những gì tôi tự hỏi là liệu trình biên dịch được phép xây dựng một đối tượng kiểu A
từ một đối tượng địa phương loại B
bằng tham chiếu rvalue nếu nó đang được xây dựng trong câu lệnh trả về. Nói cách khác, trong ví dụ sau, trình biên dịch có được phép chọn phương thức khởi tạocho giá trị trả về không?
struct B { };
struct A {
A(A&); // (1)
A(A&&); // (2)
A(B&); // (3)
A(B&&); // (4)
};
A makeA()
{
B localB;
return localB;
}
Tôi yêu cầu này vì nó sẽ có vẻ với tôi rằng cùng một logic cho phép một đối tượng địa phương của loại A
được đối xử như một rvalue trong câu lệnh return cũng nên cho phép một địa phương của bất kỳ loại được đối xử như một giá trị, nhưng tôi không thể tìm thấy bất kỳ ví dụ hoặc câu hỏi nào về bản chất này.
Kiểm tra nhanh trên clang và g ++ cho thấy cả hai cuộc gọi # 3. –
'localB' không phải là một rvalue, vì vậy không (tốt, nó có thể làm bất cứ điều gì nó muốn miễn là nó tuân theo quy tắc" as-if ", nhưng nó không có khả năng sử dụng một di chuyển ở đây.) Bạn sẽ cần' std: : di chuyển (localB) '. – juanchopanza
@juanchopanza Không tin rằng đây là một bản sao - nếu bạn 'trả về localA;' và ngăn chặn RVO, bạn sẽ chọn hàm tạo đang dùng một 'A &&'. Câu hỏi là cụ thể cho báo cáo trả về. –