在 C++ 中,为什么我不能获取也有模板版本的函数的地址?

问题描述 投票:0回答:1

下面是一段代码,尝试向另一个可以接受任何类型值的函数提供指向重载函数的指针:

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
不明确,标准的哪一部分涵盖了它?

c++ language-lawyer overloading overload-resolution
1个回答
0
投票

编译器如何知道你想要什么?

试试这个:

Foo

现在,
它编译了

© www.soinside.com 2019 - 2024. All rights reserved.