为何调用有无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
相关产品推荐
相关产品推荐

