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
相关产品推荐
相关产品推荐

