C++ 空参数包扩展不同于手动空参数包

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<>

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<>();          // 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…
)允许这样做。