加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:09:45 所属栏目:百科 来源:网络整理
导读:c(GNU GCC g). “调用”函数没有() 该函数不工作,但编译好. 更令人惊讶的是,这样的代码总是返回1 … 有没有解释? 我期望功能名称只是一个常规的指针,但似乎有点不同… 我有机会得到所有的1? #include iostreamusing namespace std;void pr (){ cout "sth";
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的功能指针.这对于重载的函数和函数模板来说仍然无效,而不指定你想要的哪个重载(通常是通过一个转换).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读