一个 C++ 函数可以有多个参数包。虽然看起来不太实用,但了解它们的语言规则仍然很有趣。
例如,如果有两个重载:
constexpr int f(auto...) { return 1; }
constexpr int f(auto..., auto...) { return 2; }
Run Code Online (Sandbox Code Playgroud)
f不带参数的调用f()在 MSVC 中选择版本 1,在 Clang 中选择版本 2,ambiguous overloaded call在 GCC 中选择版本 2。
如果f使用参数调用f(1),则 MSVC 和 GCC 都选择版本 1,而 Clang 仍选择版本 2。
演示: https: //gcc.godbolt.org/z/PWr6h1dn1
这里是哪个编译器?
有一个类似的问题带有两个参数包的函数模板重载解析,但是
c++ language-lawyer overload-resolution c++20 parameter-pack