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

Empty parameter pack expansion different to manual empty parameter pack

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
}

这种行为是否符合标准?您可以看到差异的实例 here and here.

f<> 不强制空包,只是告诉模板参数的前 0 个参数。

Clang 拒绝 foo<>() (Demo),因为它无法决定 baz 的哪个重载用于 bar<>(baz);

gcc 接受它的事实似乎是一个错误。