Hãy nói rằng tôi có chức năng này:Hành vi của hàm C++ template
bool f(int&& one, int&& two) { }
Nếu tôi cố gắng gọi nó với mã này:
int x = 4;
f(x, 5);
trình biên dịch sẽ phàn nàn rằng nó không thể chuyển đổi x từ vế trái tham chiếu đến tham chiếu rvalue, đó là chính xác.
Bây giờ nếu tôi chuyển đổi f thành một mẫu hàm như thế này:
template <class T, class U>
bool f(T&& one, U&& two) { }
sau đó tôi có thể gọi nó với một tài liệu tham khảo giá trị trái:
int x = 5;
f(x, 5);
Tại sao nó như vậy? Tại sao trình biên dịch không phàn nàn trong trường hợp này?
Trong khi tham chiếu sụp đổ không xảy ra trong trường hợp của một "tham chiếu phổ quát" ma thuật thực sự xảy ra trước bước này và xảy ra trong quá trình khấu trừ đối số mẫu. Lưu ý của bạn về tham chiếu sụp đổ không hoạt động trong một chức năng bình thường chỉ đơn giản là sai; sự sụp đổ tham chiếu có thể xảy ra ở bất cứ đâu: 'sử dụng T = int &&; void foo (T & x); 'ở đây x là một' int & 'do tham chiếu sụp đổ. – Simple
@Simple trông giống như quyền của bạn, tôi đã biết rằng decltypes và tự động có thể có tham chiếu sụp đổ, không biết rằng một typedef có thể gây ra nó, tôi sẽ sửa đổi câu trả lời của tôi – aaronman