相关疑难解决方法(0)

C++ 中具有多个参数包的函数的重载解析

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

15
推荐指数
1
解决办法
333
查看次数