首页 > 后端开发 > C++ > 正文

为什么 `std::cout

Mary-Kate Olsen
发布: 2024-10-28 02:37:31
原创
982 人浏览过

Why does `std::cout

f 的奇怪案例;为什么它总是在输出中打印 1?

遇到一种特殊的行为,即调用不带括号 (f;) 的函数并使用 std::cout 打印其结果始终产生数字 1 可能会引发问题。最初,人们可能期望代码打印一个函数指针,但观察结果表明并非如此。

深入研究下面的代码:

<code class="cpp">#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;从技术上讲并没有调用 pr() 函数。相反,函数指针被传递给 cout。当函数指针在此过程中转换为 bool 值时,其行为类似于非零值计算结果为 true 的逻辑表达式。打印时这会转换为 1。

此外,在 C 11 之前的标准中,不存在允许流式传输函数指针的重载。这使得直接使用 std::cout 格式化和打印函数指针变得具有挑战性。然而,随着 C 11 的出现,人们可以定义一个自定义重载来实现这一目标:

<code class="cpp">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 现在将打印:

<code class="text">(func_ptr=<address of pr>)(num_args=0)</code>
登录后复制

此自定义重载演示了打印不同数量的函数指针。虽然它缓解了函数指针的问题,但它并没有完全解决涉及重载函数或函数模板的场景,在这些场景中指定所需的重载变得至关重要。

以上是为什么 `std::cout的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!