8

Làm thế nào để chuyên hàm mẫu variadic có tham chiếu const cho đối số?Chuyên môn khuôn mẫu biến thể với tham chiếu const

Ví dụ:

template<typename T, typename... Args> 
T foo(Args... args) = delete; 

template<> int foo(int a, const char* str, const Test& t) { .... } // Fails to compile 
//template<> int foo(int a, const char* str, Test) { .... } // Ok 

int main() { 

    auto i = foo<int>(10, "test string!", t); 
    return 0; 
} 

Khi gọi hàm foo với tuyên bố const Test& lập luận, trình biên dịch không thấy chức năng chuyên ngành và fallbacks chức năng xóa:

error: use of deleted function ‘T foo(Args ...) [with T = int; Args = {int, const char*, Test}]’ 
    auto i = foo<int>(10, "test string!", t); 




Các biên dịch mã trên tốt nếu tôi loại bỏ tham chiếu const từ đối số. Tôi đang làm gì sai?

Mã này có thể được tìm thấy here

Trả lời

3

tự động khấu trừ mẫu là không đủ thông minh để đoán rằng bạn muốn nó để thiết lập các tham số mẫu cuối cùng để const Test& thay vì Test. Chính xác hơn loại khấu trừ luôn loại bỏ vòng loại cv từ một loại.

Bạn mới mẫu rõ ràng instantiation đây:

auto i = foo<int, int, const char *, const Test&>(10, "test string!", t); 
+0

Tất nhiên, tôi hoàn toàn quên instantiation về rõ ràng. Cảm ơn câu trả lời của bạn! – Bected

7

Điều này là do các đối số template mẫu chính suy ra cho cuộc gọi của bạn là int, const char*Test, không const Test&. Điều này có nghĩa là chuyên môn của bạn không được sử dụng vì các đối số mẫu không khớp với các tham số.

lựa chọn đơn giản nhất của bạn là để cung cấp một quá tải riêng biệt chứ không phải là một chuyên môn:

template <typename T> 
T foo(int a, const char* str, const Test& t) { /*...*/; } 

Live demo

Các vấn đề liên quan