c – g“调用”函数不带括号(不是f(),而是f;).为什么总是返回1?

前端之家收集整理的这篇文章主要介绍了c – g“调用”函数不带括号(不是f(),而是f;).为什么总是返回1?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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

}

解决方法

你实际上并没有在你的代码调用pr,你将函数指针传递给cout.当被传递给cout时,pr被转换成bool.如果你把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 =< pr>的地址)(num_args = 0).该功能本身可以做任何你想要的显然,这只是为了证明,使用C 11的可变模板,你可以匹配任意arity的功能指针.这对于重载的函数函数模板来说仍然无效,而不指定你想要的哪个重载(通常是通过一个转换).

原文链接:https://www.f2er.com/c/112345.html

猜你在找的C&C++相关文章