2015-01-18 41 views
9

Các biên dịch sau đây trong vang nhưng không phải trong gcc:chức năng mơ hồ gọi với hai tham số gói

template <class... Ts, class... Args> 
void f(Ts&&..., Args&&...); 

int main() 
{ 
    f(); 
} 

Đây là lỗi tôi nhận được trong GCC:

main.cpp: In function 'int main()': 
main.cpp:30:7: error: no matching function for call to 'f()' 
    f(); 
    ^
main.cpp:30:7: note: candidate is: 
main.cpp:23:6: note: template<class ... Ts, class ... Args> void f(Ts&& ..., Args&& ...) 
void f(Ts&&..., Args&&...) 
    ^
main.cpp:23:6: note: template argument deduction/substitution failed: 
main.cpp:30:7: note: candidate expects 1 argument, 0 provided 
    f(); 
    ^

Nếu tôi đưa ra một lập luận như f(0) sau đó nó biên dịch với GCC nhưng không phải với Clang.

Lỗi với kêu vang:

main.cpp:30:5: error: no matching function for call to 'f' 
    f(0); 
    ^
main.cpp:23:6: note: candidate function not viable: requires 0 arguments, but 1 was provided 
void f(Ts&&..., Args&&...) 
    ^
1 error generated. 

Nếu tôi cung cấp cho cùng một số đối số mẫu rõ ràng như thông số chức năng sau đó nó biên dịch với cả hai trình biên dịch (nghĩa là f<int, int, int>(0, 0, 0)).

+8

Tôi không thấy cách tính năng này hoạt động. Nếu bạn gọi 'f (1, 2, 3, 4)' hoặc thậm chí 'f (1, 2, 3, 4)' - đó là 'Ts' và đó là' Args' ? Làm thế nào trình biên dịch có thể cho biết nơi kết thúc cũ và sau này bắt đầu? Có hai và hai, một và ba, số không và bốn? –

+2

@IgorTandetnik Tôi không mong đợi bất kỳ người trong số họ làm việc. –

+5

Gửi báo cáo lỗi "chấp nhận không hợp lệ" cho mỗi. – Deduplicator

Trả lời

2

Mẫu thứ hai tham số gói Args thực sự là suy luận:

Một gói dấu mẫu tham số (14.5.3) không khác suy luận sẽ được rút ra để một chuỗi rỗng của các đối số mẫu.

Tính đến điều đó, nó cũng trở nên rõ ràng, ví dụ: f<int>(0) được thiết lập tốt. Tuy nhiên, Ts không bao giờ được suy luận. [Temp.deduct.call]/1:

Khi một gói thông số chức năng xuất hiện trong một bối cảnh không suy luận (14.8.2.5), loại mà thông số gói không bao giờ suy luận.

Lưu ý rằng báo giá trước đó không áp dụng cho Ts, vì nó không theo sau. Do đó, khấu trừ thuần túy sẽ luôn thất bại.

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