なぜ `std::cout は

Oct 28, 2024 am 02:37 AM

Why does `std::cout

f の奇妙な事件;出力に常に 1 が出力されるのはなぜですか?

括弧 (f;) なしで関数を呼び出し、その結果を std::cout で出力すると一貫して数値 1 が出力されるという奇妙な動作に遭遇すると、疑問が生じることがあります。最初は、コードが関数ポインターを出力することを期待するかもしれませんが、観察ではそうではないことが示されています。

以下のコードを詳しく見てみると、

<code class="cpp">#include &lt;iostream&gt;
using namespace std;

void pr()
{
    cout &lt;&lt; &quot;sth&quot;;
}

int main()
{
    pr;
    cout &lt;&lt; pr;  // output: 1
    cout &lt;&lt; *pr; // output: 1
    cout &lt;&lt; &amp;pr; // output: 1
}
ログイン後にコピー

次のことがわかります。技術的には pr() 関数を呼び出しません。代わりに、関数ポインタが cout に渡されます。このプロセス中に関数ポインタが bool に変換されると、ゼロ以外の値が true と評価される論理式と同様に動作します。これは、印刷時に 1 に変換されます。

さらに、C 11 より前の標準では、関数ポインターのストリーミングを許可するオーバーロードは存在しません。このため、std::cout を使用して関数ポインターを直接フォーマットして出力することが困難になります。ただし、C 11 の出現により、これを実現するためにカスタム オーバーロードを定義できるようになりました。

<code class="cpp">template &lt;class RType, class ... ArgTypes&gt;
std::ostream &amp; operator&lt;&lt;(std::ostream &amp; s, RType(*func)(ArgTypes...))
{
    return s &lt;&lt; &quot;(func_ptr=&quot; &lt;&lt; (void*)func &lt;&lt; &quot;)(num_args=&quot;
             &lt;&lt; sizeof...(ArgTypes) &lt;&lt; &quot;)&quot;;
}
ログイン後にコピー

このオーバーロードを使用すると、cout << pr は次を出力します:

<code class="text">(func_ptr=&lt;address of pr&gt;)(num_args=0)</code>
ログイン後にコピー

このカスタム オーバーロードは、さまざまなアリティの関数ポインターの出力を示します。関数ポインターの問題は軽減されますが、目的のオーバーロードの指定が不可欠となる、オーバーロードされた関数または関数テンプレートに関係するシナリオを完全に解決するわけではありません。

以上がなぜ `std::cout はの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

c言語関数形式文字ケース変換手順 c言語関数形式文字ケース変換手順 Mar 03, 2025 pm 05:53 PM

c言語関数形式文字ケース変換手順

GULC:Cライブラリはゼロから構築されています GULC:Cライブラリはゼロから構築されています Mar 03, 2025 pm 05:46 PM

GULC:Cライブラリはゼロから構築されています

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? Mar 03, 2025 pm 05:52 PM

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

C標準テンプレートライブラリ(STL)はどのように機能しますか? C標準テンプレートライブラリ(STL)はどのように機能しますか? Mar 12, 2025 pm 04:50 PM

C標準テンプレートライブラリ(STL)はどのように機能しますか?

C言語関数の定義と呼び出しルールは何ですか、そして C言語関数の定義と呼び出しルールは何ですか、そして Mar 03, 2025 pm 05:53 PM

C言語関数の定義と呼び出しルールは何ですか、そして

メモリに保存されているC言語関数の返品値はどこにありますか? メモリに保存されているC言語関数の返品値はどこにありますか? Mar 03, 2025 pm 05:51 PM

メモリに保存されているC言語関数の返品値はどこにありますか?

明確な使用法とフレーズ共有 明確な使用法とフレーズ共有 Mar 03, 2025 pm 05:51 PM

明確な使用法とフレーズ共有

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? Mar 12, 2025 pm 04:52 PM

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?

See all articles