Tôi xin lỗi nếu tiêu đề câu hỏi không chính xác - nhưng tôi gặp khó khăn khi hiểu những gì đang diễn ra ở đây.Giảm dần giá trị để rvalue với lỗi tự động
Hãy xem xét các lớp sau đây:
struct foo {
foo(foo&);
};
Sau đây không có lỗi:
void func(foo& f) {
foo bar{f};
}
Tuy nhiên, khi tôi sử dụng auto:
void func(foo& f) {
auto bar = foo{f};
}
tôi nhận được (gcc):
test.cpp: In function ‘void func(foo&)’:
test.cpp:6:21: error: no matching function for call to ‘foo::foo(foo)’
test.cpp:6:21: note: candidate is:
test.cpp:2:5: note: foo::foo(foo&)
test.cpp:2:5: note: no known conversion for argument 1 from ‘foo’ to ‘foo&’
(vang)
test.cpp:6:10: error: no matching constructor for initialization of 'bar'
auto bar = foo{f};
^ ~~~~~~
test.cpp:2:5: note: candidate constructor not viable: expects an l-value for 1st argument
foo(foo&);
^
ai đó có thể vui lòng giải thích lý do tại sao đây là một lỗi?
Cảm ơn!
Chỉnh sửa: Nó hoạt động nếu tôi thêm một hàm tạo bản sao vào foo. Tuy nhiên, tôi đã ấn tượng rằng việc khai báo biến + lời gọi rõ ràng đến hàm tạo ở bên phải của cú pháp '=' được xử lý đặc biệt và không phải là một bản sao xây dựng mà là khởi tạo trực tiếp.
Trình biên dịch có phát ra cuộc gọi đến trình tạo bản sao không? Tôi đã theo ấn tượng rằng trình biên dịch sẽ coi đây là khởi tạo trực tiếp. –
Nhập Ahh trên Android chậm và dường như không có cách nào để xóa câu trả lời cũng như –
@RobertMason Trình biên dịch có thể bỏ cuộc gọi đến một trình tạo bản sao không có tác dụng phụ, nhưng trình tạo bản sao vẫn phải gọi. – Oktalist