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

C++中为何无法获取存在模板版本的函数的地址?

重载函数指针传递的歧义问题

以下代码尝试将重载函数的指针传递给可接受任意类型值的函数:

template <typename T>
void AcceptAnything(T&&);

void Foo();

template <typename T>
void Foo();

void Bar() {
  AcceptAnything(&Foo);
}

该代码无法编译,clang下的错误信息如下:

:10:3: error: no matching function for call to 'AcceptAnything' 10 | AcceptAnything(&Foo); | ^~~~~~~~~~~~~~ :2:6: note: candidate template ignored: couldn't infer template argument 'T' 2 | void AcceptAnything(T&&); | ^

我理解一般情况下无法对重载函数执行此操作,但在此特定场景中,我惊讶于&Foo的类型并非void(*)(),因为未提供模板参数。我的认知模型是:

  • 唯一名为Foo的函数是非模板版本,另一个是针对任意类型T的函数族Foo<T>;
  • 表达式&Foo指向特定名为Foo的函数的地址;
  • 不存在函数族的地址。

因此我认为&Foo明确指向非模板函数Foo的指针,但gcc和clang均不认可,说明我的认知有误。

为何&Foo在此场景下存在歧义?标准中哪部分对此有规定?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:41:25