空参数包扩展不同于手动空参数包
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
}
f<>
不强制空包,只是告诉模板参数的前 0 个参数。
Clang 拒绝 foo<>()
(Demo),因为它无法决定 baz
的哪个重载用于 bar<>(baz);
gcc 接受它的事实似乎是一个错误。
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
}
f<>
不强制空包,只是告诉模板参数的前 0 个参数。
Clang 拒绝 foo<>()
(Demo),因为它无法决定 baz
的哪个重载用于 bar<>(baz);
gcc 接受它的事实似乎是一个错误。