18

在 c++ (GNU GCC g++) 中,我的代码是“调用”一个没有 () 的函数。该功能不起作用,但编译正常。

更令人惊讶的是,代码总是返回 1...

有什么解释吗?

我希望函数名只是一个常规指针,但似乎有点不同......

我得到全1只是偶然吗?

#include <iostream>
using namespace std;

void pr ()
{
    cout << "sth";
}

int main()
{

pr;
cout << pr;  // output: 1
cout << *pr; // output: 1
cout << &pr; // output: 1

}
4

2 回答 2

19

您实际上并没有调用pr代码,而是将函数指针传递给cout. pr然后bool在被传递给时被转换为cout. 如果您cout << boolalpha预先放置,您将输出true而不是1.

编辑:
使用 C++11,您可以编写以下重载:

    template <class RType, class ... ArgTypes>
    std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...))
    {
        return s << "(func_ptr=" << (void*)func << ")(num_args=" 
                 << sizeof...(ArgTypes) << ")";
    }

这意味着呼叫cout << pr将打印(func_ptr=<address of pr>)(num_args=0)。显然,函数本身可以做任何你想做的事情,这只是为了证明使用 C++11 的可变参数模板,你可以匹配任意数量的函数指针。如果没有指定您想要的重载(通常通过强制转换),这仍然不适用于重载函数和函数模板。

于 2013-06-12T18:52:55.933 回答
5

函数名在使用时不带括号,可以隐式转换为函数指针。实际上,当您取消引用或引用它时,它只剩下一个函数指针或指向函数指针的指针等。这些函数指针在打印时被隐式转换为bool,这就是它们简单地输出 1 的原因。如果你想要输出函数的实际内存地址,将其转换为 void 指针:

cout<<(void*)pr;
于 2013-06-12T18:53:47.843 回答