Để từ chối đoạn mã đầu tiên của bạn, trình biên dịch áp dụng quy tắc đơn giản mà bạn không thể trực tiếp ràng buộc tạm thời với tham chiếu không phải const.
Để loại bỏ thứ hai, trình biên dịch có thể áp dụng quy tắc return
của hàm trả về tham chiếu không được là tên của biến tự động (bao gồm tham số hàm giá trị). Điều đó dường như với tôi một quy tắc khá dễ dàng.
Tôi không biết tại sao tiêu chuẩn không chỉ định rằng làm như vậy là không đúng định dạng. Tôi không thể nghĩ ra bất kỳ việc sử dụng hợp lệ nào cho nó, nhưng có lẽ tại thời điểm chuẩn đầu tiên nó sẽ tạo ra một gánh nặng quá mức đối với một số việc thực hiện hoặc khác. Hoặc có lẽ nó đã cảm thấy rằng nó chỉ là một nửa sửa chữa và không đáng làm phiền với (có rất nhiều cách khác để tạo ra một tham chiếu lơ lửng, điều này chỉ chặn một trong số họ).
Lý do tại sao tiêu chuẩn không nói chung dừng bạn tạo một tham chiếu không const ràng buộc với một tạm thời là có những lúc OK. Ví dụ:
struct Foo {
static void set(Foo &f) { f.val = 0; }
int val;
int bar() {
set(*this);
return val;
}
};
std::cout << Foo().bar() << "\n";
Đây Foo()
là tạm thời, và dòng set(*this)
liên kết nó vào một tài liệu tham khảo không const (nhưng không trực tiếp, nó sử dụng một biểu thức vế trái *this
đó đề cập đến một tạm thời một số lần nhưng không phải người khác) . Không có vấn đề ở đây, các tài liệu tham khảo tạm thời outlives. Vì vậy, nó sẽ là không cần thiết hạn chế đối với ngôn ngữ bằng cách nào đó ngăn chặn bất kỳ tạm thời từ bao giờ bị ràng buộc với bất kỳ tham chiếu không const.
Nguồn
2012-03-06 15:53:46
Đây là UB (tốt, truy cập tham chiếu, dù sao) và bất kỳ trình biên dịch lành mạnh nào cũng cảnh báo bạn về nó. –