下面是一段代码,尝试向另一个可以接受任何类型值的函数提供指向重载函数的指针:
template <typename T>
void AcceptAnything(T&&);
void Foo();
template <typename T>
void Foo();
void Bar() {
AcceptAnything(&Foo);
}
这无法编译,在 clang 下给出以下错误:
<source>:10:3: error: no matching function for call to 'AcceptAnything'
10 | AcceptAnything(&Foo);
| ^~~~~~~~~~~~~~
<source>:2:6: note: candidate template ignored: couldn't infer template argument 'T'
2 | void AcceptAnything(T&&);
| ^
我理解为什么一般情况下不能对重载函数执行此操作。但在这种特殊情况下,我很惊讶
&Foo
没有类型 void(*)()
,因为没有提供模板参数。我的心理模型是:
这里唯一名为
Foo
的函数是非模板函数,另一个函数是一系列名为 Foo<T>
的函数,适用于任何类型 T
。
表达式
&Foo
指的是名为Foo
的特定函数的地址。
不存在函数族地址这样的东西。
所以我希望
&Foo
明确表示“指向非模板化函数 Foo
的指针”。但 gcc 和 clang 都不同意我的观点,所以我的思维模式一定是错误的。
为什么在这种情况下
&Foo
不明确,标准的哪一部分涵盖了它?