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)
).
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? –
@IgorTandetnik Tôi không mong đợi bất kỳ người trong số họ làm việc. –
Gửi báo cáo lỗi "chấp nhận không hợp lệ" cho mỗi. – Deduplicator