You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用有无C风格可变参数的重载函数会产生歧义?

C风格可变参数重载的歧义困惑

我原本以为,当存在带...和不带...的重载函数时,只有传入超出最后一个命名参数的额外参数时,才会选中带...的版本。但调用test("hi")时却触发了重载歧义错误,这让我十分困惑。

代码示例

void test(char const*);
void test(char const*, ...);
// template <typename...Ts> void test(char const*, Ts...);

int main()
{
    test("hi");
    return 0;
}

如果换成C++模板可变参数就不会有问题,但我实际场景必须使用C风格版本,同时想弄明白歧义产生的原因:

  • 为什么第一个重载没被优先选中?它难道不是更匹配的版本吗?
  • 为什么两个重载的匹配度会被判定为相当?

补充:临时解决办法

为了绕开这个歧义,我用了如下方案:

void test(char const*);
namespace detail {
  void test(char const*, ...);
}
template <typename...Ts>
void test(char const* fmt, Ts const&...args) {
  detail::test(fmt, args...);
}

这方法在我看来既复杂又没必要,但目前似乎只能这么处理。

另外有人提到...表示“0个或多个参数”,但模板可变参数也是同样的规则,为什么两者的重载匹配结果不一样?


内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:57:39