在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 << ≺ // 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的函数指针.如果没有指定您想要的过载(通常通过强制转换),这仍然不适用于重载的函数和函数模板.
函数名在不带括号的情况下可以隐式转换为函数指针。事实上,当您取消引用或引用它时,它只剩下一个函数指针或指向函数指针的指针等。这些函数指针在打印时会隐式转换为bool,这就是为什么它们只是输出 1。如果您想要输出函数的实际内存地址,将其转换为 void 指针:
cout<<(void*)pr;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4134 次 |
| 最近记录: |