g ++"调用"一个没有括号的函数(不是f()而是f;).为什么它总是返回1?

myf*_*ox3 15 c++ g++

在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

}
Run Code Online (Sandbox Code Playgroud)

Sir*_*Guy 16

你实际上没有调用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) << ")";
    }
Run Code Online (Sandbox Code Playgroud)

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


Ian*_*ney 5

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

cout<<(void*)pr;
Run Code Online (Sandbox Code Playgroud)