带有两个参数包的模糊函数调用
Ambiguous function call with two parameter packs
以下在 clang 中编译但在 gcc 中不编译:
template <class... Ts, class... Args>
void f(Ts&&..., Args&&...);
int main()
{
f();
}
这是我在 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();
^
如果我给出类似 f(0)
的参数,那么它会使用 GCC 进行编译,但不会使用 Clang。
clang 错误:
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.
如果我给出与函数参数相同数量的显式模板参数,那么它会在两个编译器中编译(即 f<int, int, int>(0, 0, 0)
)。
第二个模板参数包Args
确实推导:
A trailing template parameter pack (14.5.3) not otherwise deduced will
be deduced to an empty sequence of template arguments.
考虑到这一点,例如f<int>(0)
格式正确。但是,永远不会推导出 Ts
。 [temp.deduct.call]/1:
When a function parameter pack appears in a non-deduced context
(14.8.2.5), the type of that parameter pack is never deduced.
请注意,前面的引用不适用于 Ts
,因为它不是尾随的。所以,单纯的推导总是失败的。
以下在 clang 中编译但在 gcc 中不编译:
template <class... Ts, class... Args>
void f(Ts&&..., Args&&...);
int main()
{
f();
}
这是我在 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();
^
如果我给出类似 f(0)
的参数,那么它会使用 GCC 进行编译,但不会使用 Clang。
clang 错误:
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.
如果我给出与函数参数相同数量的显式模板参数,那么它会在两个编译器中编译(即 f<int, int, int>(0, 0, 0)
)。
第二个模板参数包Args
确实推导:
A trailing template parameter pack (14.5.3) not otherwise deduced will be deduced to an empty sequence of template arguments.
考虑到这一点,例如f<int>(0)
格式正确。但是,永远不会推导出 Ts
。 [temp.deduct.call]/1:
When a function parameter pack appears in a non-deduced context (14.8.2.5), the type of that parameter pack is never deduced.
请注意,前面的引用不适用于 Ts
,因为它不是尾随的。所以,单纯的推导总是失败的。