空参数包扩展与手动空参数包

时间:2015-11-04 12:02:53

标签: 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<>();          // Deduces baz()
    //bar<>(baz);     // Ambiguous
    foo<int>();       // Deduces baz(int)
    bar<int>(baz);    // Deduces baz(int)
    //foo<void>();    // Ambiguous
    //bar<void>(baz); // Ambiguous
}

此行为符合标准吗?您可以看到差异的实时示例herehere

1 个答案:

答案 0 :(得分:2)

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

Clang拒绝foo<>()Demo),因为无法确定baz

bar<>(baz);超载

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