tôi có mã nàyTrình biên dịch nghĩ rằng "A (A &)" chấp nhận giá trị trong một thời điểm?
struct A { A(); A(A&); };
struct B { B(const A&); };
void f(A);
void f(B);
int main() {
f(A());
}
Trước sự ngạc nhiên của tôi này không thành công với GCC và Clang. Clang nói ví dụ
Compilation finished with errors:
source.cpp:8:10: error: no matching constructor for initialization of 'A'
f(A());
^~~
source.cpp:1:21: note: candidate constructor not viable: expects an l-value for 1st argument
struct A { A(); A(A&); };
^
source.cpp:1:16: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
struct A { A(); A(A&); };
^
source.cpp:4:13: note: passing argument to parameter here
void f(A);
Tại sao họ chọn f
đầu tiên, khi lần thứ hai f
hoạt động tốt? Nếu tôi xóa f
đầu tiên, thì cuộc gọi thành công. Có gì là lạ hơn với tôi, nếu tôi sử dụng cú đúp khởi, nó cũng hoạt động tốt
int main() {
f({A()});
}
Tất cả họ đều gọi thứ hai f
.
Cảm ơn! Tôi không thể tìm thấy quy tắc nào cho trường hợp '{...}'. Điều đó có giải thích tại sao trường hợp '{...}' hoạt động không? –
@ JohannesSchaub-litb: Tôi không chắc chắn, tbh, bạn đang gọi hàm với một _braced-init-list_ để các quy tắc chắc chắn khác nhau. –
@ JohannesSchaub-litb Xem [over.ics.list]. Tôi nghĩ rằng phải làm gì với [over.ics.ref]/3 (Tôi đã đọc sai mã của bạn trước đó): Khi tạo thành tập con của các hàm khả thi, ctor 'A (A &)' không được coi là khả thi vì nó liên kết một tham chiếu tạm thời với tham số không phải const. – dyp