2011-09-07 41 views
12

Tôi đã sửa một lỗi khác trong một số mã và gặp một số mã mà tôi đã nghĩ là một lỗi; tuy nhiên, mã này biên dịch theo gcc 4.4, 4.5 và 4.6 và xuất hiện với chức năng là "dự kiến". Bất cứ ai có thể cho tôi biết nếu điều này là hợp lệ c + +?trở về theo giá trị được gán cho tham chiếu const

struct foo { 
    int bar; 
}; 

foo myfunction(foo const &orig) { 
    foo fooOnStack = orig; 
    fooOnStack.bar *= 100; 
    return fooOnStack; 
} 

void myOtherFunction(foo const &orig) { 
    foo const &retFoo = myfunction(); 
    // perhaps do some tests on retFoo.bar ... 
} 

Nếu điều này là hợp lệ C++, có ai biết lý do đằng sau điều này là hợp pháp không?

+3

Lý do chính tắc được nêu ở đây: [GotW # 88: Ứng cử viên cho “const quan trọng nhất”] (http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for- quan trọng nhất-const /). – ildjarn

+0

Ngoài ra, các tiêu chuẩn hỗ trợ này là hợp pháp C + + là trong C++ 03 §12.2/5. – ildjarn

+0

Cảm ơn, tôi đã học được một số C++ hôm nay. Nó có ý nghĩa, nhưng tôi chưa bao giờ sử dụng nó trước đây, và biết rằng quay trở lại một tham chiếu không const không được phép. – graphicsMan

Trả lời

24

Có, đây là C++ hợp pháp. Việc tạo thành một tham chiếu đến const để tạm thời kéo dài tuổi thọ của thời gian tạm thời cho toàn bộ thời gian tham chiếu.

-1

Tôi nghĩ bạn vẫn cần phải cẩn thận. Tôi có một trường hợp mà g ++ - 4.9 với C++ 11 và các loại Eigen phức tạp không tôn trọng điều này (nó xóa dữ liệu trong tạm thời trả về mặc dù tuổi thọ của nó được cho là được mở rộng). Do đó, mặc dù nó có thể là hợp pháp nó nên được gắn cờ là tinh ranh, trừ khi có một lý do thực sự tốt cho nó.

Ngoài ra, với C++ 11 PHẢI phân bổ tạm thời tại trang cuộc gọi nếu được trả về bằng giá trị, tính hữu ích của nó có thể ít hơn mức sử dụng nếu bạn đang sử dụng tiêu chuẩn mới nhất.

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