Mọi trường hợp đều đúng. Tất cả chúng sẽ xây dựng tạm thời và áp dụng hàm tạo bản sao của kiểu trả về. Nhất thiết, nếu không có hàm tạo bản sao, mã sẽ thất bại.
RVO sẽ xảy ra trên cả ba trường hợp theo hầu hết các trình biên dịch. Chỉ có sự khác biệt là tiêu chí cuối cùng mà tiêu chuẩn không ép buộc nó. Điều này bởi vì bạn có một biến được đặt tên. Nhưng hầu hết các trình biên dịch đủ thông minh để áp dụng RVO cho nó vẫn ... sau đó biến được đặt tên được khai báo và biến đổi ít được áp dụng, tỷ lệ cược tốt hơn cho RVO được áp dụng cho biến được đặt tên.
Ngẫu nhiên, việc trả về một tham chiếu là tất nhiên có thể như bạn có thể đã thấy trong mã khác. Những gì bạn không phải làm là trả về một tham chiếu t một đối tượng cục bộ.
std::string& get_a_string2()
{
std::string str("hello");
return str; //error!
}
Sẽ tạo ra lỗi thời gian biên dịch, như bạn đã biết. Tuy nhiên,
std::string& get_a_string2(std::string& str)
{
// do something to str
return str; //OK
}
Sẽ hoạt động tốt. Trong trường hợp này, không có công trình xây dựng hoặc bản sao nào liên quan. Đơn giản chỉ cần hàm trả về một tham chiếu đến đối số của nó.
Nguồn
2009-09-08 14:21:46
Có cách nào trong VS2008 để tắt tất cả các tối ưu hóa bao gồm RVO? Tôi đã tắt tất cả nhưng nó vẫn đang làm RVO. Đây chỉ là để hiểu sự khác biệt. –
'/ Od' nên tắt NRVO, nhưng tôi không chắc về RVO. –
Cảm ơn. Hãy để tôi thử rằng –