xem xét mã này,chuyển đổi ngầm định: tham chiếu const vs tham chiếu không const vs phi tham khảo
struct A {};
struct B { B(const A&) {} };
void f(B)
{
cout << "f()"<<endl;
}
void g(A &a)
{
cout << "g()" <<endl;
f(a); //a is implicitly converted into B.
}
int main()
{
A a;
g(a);
}
compiles fine này, chạy tốt. Nhưng nếu tôi thay đổi f(B)
thành f(B&)
, nó doesn't compile. Nếu tôi viết f(const B&)
, nó lại compiles fine, chạy tốt. Tại sao lý do và lý do?
Tóm tắt:
void f(B); //okay
void f(B&); //error
void f(const B&); //okay
Tôi muốn nghe lý do này, lý do và tài liệu tham khảo (s) từ đặc tả ngôn ngữ, cho mỗi trường hợp này. Tất nhiên, bản thân chữ ký chức năng không chính xác. Thay vào đó, A
chuyển đổi hoàn toàn thành B
và const B&
, nhưng không chuyển thành B&
và gây ra lỗi biên dịch.
Một điều thú vị: Trong ARM, việc xác định độ chính xác cho biểu thức chính như sau: "Kết quả là một giá trị nếu từ định danh là". .. "Kết quả là một lvalue nếu thành viên là.". Tôi đã tự hỏi những gì heck có nghĩa là, bởi vì nó cũng định nghĩa "Một lvalue là một biểu hiện đề cập đến một đối tượng hoặc chức năng.". Hmm, có lẽ nó chỉ có nghĩa là "Kết quả là một lvalue nếu nó đề cập đến một đối tượng hoặc chức năng."? –
Điều này là tốt. Tôi nghĩ rằng nó tốt hơn câu trả lời cho câu hỏi của tôi, vì nó giải thích lý do tại sao nó không được phép. Tôi chấp nhận điều này như là câu trả lời cho câu hỏi của tôi. :-) – Nawaz