Câu trả lời ngắn gọn là có.
Nếu đối tượng được nhận bởi hàm như tham số tham chiếu const - khi bạn đã sửa đổi phương thức bar(const A&)
, thì nó hoàn toàn hợp pháp. Hàm có thể hoạt động trên đối tượng, nhưng đối tượng sẽ bị hủy sau khi cuộc gọi hàm (địa chỉ tạm thời có thể được thực hiện, nhưng sẽ không được lưu trữ và sử dụng sau khi gọi hàm - xem lý do bên dưới).
foo(A*)
cũng hợp pháp vì đối tượng tạm thời bị hủy khi kết thúc ghi hình. Tuy nhiên hầu hết các trình biên dịch sẽ phát ra cảnh báo về việc lấy địa chỉ tạm thời.
Phiên bản gốc của bar(A&)
không được biên dịch, nó không phù hợp với tiêu chuẩn để khởi tạo tham chiếu không const từ tạm thời.
chuẩn C++ chương 12,2
3 [...] đối tượng tạm thời bị phá hủy như là bước cuối cùng trong việc đánh giá các fullexpression (1.9) mà (giải nghĩa từ vựng) chứa các điểm mà họ đã tạo ra. [...]
4 Có hai ngữ cảnh trong đó thời gian tạm thời bị hủy tại một điểm khác với điểm kết thúc của quá trình nén. Ngữ cảnh đầu tiên là khi một biểu thức xuất hiện như một bộ khởi tạo cho một người khai báo xác định một đối tượng. Trong bối cảnh đó, tạm thời giữ kết quả của biểu thức sẽ vẫn tồn tại cho đến khi khởi tạo của đối tượng hoàn tất. [...]
5 Ngữ cảnh thứ hai là khi tham chiếu bị ràng buộc tạm thời. Tạm thời mà tham chiếu bị ràng buộc hoặc tạm thời là đối tượng hoàn chỉnh đối với một đối tượng con trong đó tạm thời bị ràng buộc tồn tại trong suốt thời gian tồn tại của tham chiếu ngoại trừ được chỉ định bên dưới. Một ràng buộc tạm thời cho một thành viên tham chiếu trong ctorinitializer của một hàm tạo (12.6.2) vẫn tồn tại cho đến khi hàm khởi tạo xuất hiện. Một ràng buộc tạm thời với tham số tham chiếu trong một cuộc gọi hàm (5.2.2) vẫn tồn tại cho đến khi hoàn thành biểu thức đầy đủ có chứa cuộc gọi. Một ràng buộc tạm thời với giá trị trả về trong câu lệnh trả về hàm (6.6.3) vẫn tồn tại cho đến khi hàm thoát.
A fullexpression là một biểu thức không phải là biểu hiện của một biểu thức khác.
nó bị cấm để lấy địa chỉ của một rvalue, không phải là tạm thời cụ thể. đó là lý do tại sao điều này bị cấm; 'A()' trả về một giá trị. –
@underscore_d Đúng - Tôi đã sử dụng cụm từ không chính thức 'tạm thời', cụ thể hơn là biến tạm thời chưa được đặt tên và, như bạn nói đúng, một giá trị. Nếu chúng ta đang kén chọn, 'A()' không 'trả về' một giá trị (các hàm tạo không có giá trị trả về), đó là một biểu thức giá trị. –
Tốt bắt - đó là quá dễ dàng để theo phản xạ suy nghĩ của các nhà thầu như các cuộc gọi chức năng. –