Bạn không thể thực hiện việc này. Tài liệu tham khảo phải được ràng buộc với một cái gì đó, bạn có thể không thích nó nhưng nó ngăn chặn một lớp toàn bộ các lỗi, bởi vì nếu bạn có một tham chiếu, bạn luôn có thể giả định nó bị ràng buộc với một cái gì đó, không giống như một con trỏ có thể là null.
Mã ví dụ của bạn sẽ không hoạt động vì bạn cố gắng liên kết tham chiếu không phải const với đối tượng tạm thời, không hợp lệ.
Tại sao bạn cần nó làm tham chiếu? Một giải pháp sẽ được đảm bảo loại của bạn có một constructor mặc định không tốn kém và có thể được di chuyển một cách hiệu quả, sau đó chỉ cần làm:
MyObject obj;
if([condition])
obj = MyObject([something])
else
obj = MyObject([something else]);
Nếu không, bạn sẽ phải đặt mã có điều kiện trong một hoặc nhiều chức năng, một trong hai:
const MyObject& ref = createObject([condition]);
hoặc
const MyObject& ref = [condition] ? doSomething() : doSomethingElse();
Lưu ý rằng cả hai phiên bản sử dụng một const tài liệu tham khảo, có thể liên kết với một tạm thời, nếu đối tượng phải không const, sau đó một lần nữa dừng lại cố gắng sử dụng một tài liệu tham khảo:
MyObject obj = createObject([condition]);
này có lẽ sẽ giống như hiệu quả như những gì bạn đang cố gắng để làm, nhờ sự return value optimization
Nguồn
2013-02-14 20:30:24
Đó có phải là khởi tạo từ tạm thời không? Điều đó sẽ không hoạt động ngay cả khi không có điều kiện: 'MyObject & ref = MyObject ([something]);', bởi vì bạn không thể liên kết tạm thời với tham chiếu không phải lvalue. – GManNickG
@GManNickG: điều này cũng áp dụng cho câu trả lời của Zaffy và suszterpatt? – qPCR4vir
@ qPCR4vir: Yup. Câu hỏi vẫn đứng, theo một cách nào đó, không phải trực tiếp. – GManNickG