template <typename T>
T go(T a, T *b){ T *t; return *t;}
int main() {
const int x = 10;
go(x, &x);
return 0;
}
Cung cấp cho trình biên dịch báo lỗi:Template luận thất bại khấu trừ khi đi qua địa chỉ của kiểu const
error: no matching function for call to ‘go(const int&, const int*)’
Tại sao là đối số đầu tiên một loại tài liệu tham khảo const int&
thay vì chỉ const int
?
Để khắc phục lỗi biên dịch này, tôi đã vượt qua quá trình khấu trừ trình biên dịch bằng cách chỉ định loại đối số go<const int>(x, &x);
, nhưng một lần nữa tại sao tôi cần thực hiện điều đó?
Cảm ơn, đó là thú vị, nhưng bạn có nghĩ rằng đó sẽ là một thực hành lập trình tốt xem xét lừa nó thực hiện trong nội bộ. –
@SauravSahu Một khi bạn bắt đầu thực hiện những điều phi thường với các khuôn mẫu, bạn sẽ thấy có một 'NonDeduced' ở đâu đó là phải. Và một khi bạn có nó, bạn cũng có thể sử dụng nó. Cho dù đó là một ý tưởng hay trong trường hợp cụ thể này, hoặc liệu mọi thứ có thể được thực hiện khác nhau hay không, phụ thuộc phần lớn vào những gì 'go' thực sự làm trong trường hợp sử dụng thực sự của bạn. – Angew