C++ 空参数包扩展不同于手动空参数包
GCC似乎对待将一个空参数包C++ 空参数包扩展不同于手动空参数包,c++,language-lawyer,variadic-templates,C++,Language Lawyer,Variadic Templates,GCC似乎对待将一个空参数包A扩展为另一个 参数包B与手动输入空参数包不同 B。例如: void baz(); void baz(int); template<typename... Args, typename R> void bar(R (*)(Args...)); template<typename... Args> void foo() { bar<Args...>(baz); } int main() { foo<>
A
扩展为另一个
参数包B
与手动输入空参数包不同
B
。例如:
void baz();
void baz(int);
template<typename... Args, typename R>
void bar(R (*)(Args...));
template<typename... Args>
void foo()
{
bar<Args...>(baz);
}
int main()
{
foo<>(); // Deduces baz()
//bar<>(baz); // Ambiguous
foo<int>(); // Deduces baz(int)
bar<int>(baz); // Deduces baz(int)
//foo<void>(); // Ambiguous
//bar<void>(baz); // Ambiguous
}
void baz();
void baz(int);
模板
空心条(R(*)(Args…);
模板
void foo()
{
bar和.f
不强制空包,只告诉模板参数的前0个参数
Clang拒绝使用foo()
(),因为它无法决定baz
对于bar(baz);
gcc接受这一事实似乎是一个错误。f
不强制空包,只告诉模板参数的前0个参数。@Jarod42这很有趣,而且违反直觉。你能在回答中详细说明一下吗?我想知道为什么模板是正确的。它不应该是模板
?@Glapa是正确的。为什么不正确?@Glapa:variadic后面的参数应该是可扣除的(并且R(*)(Args…
)允许这样做。