f氏の数奇な人生;出力に常に 1 が出力されるのはなぜですか?
括弧 (f;) なしで関数を呼び出し、その結果を std::cout で出力すると一貫して数値 1 が出力されるという奇妙な動作に遭遇すると、疑問が生じることがあります。最初は、コードが関数ポインターを出力することを期待するかもしれませんが、観察ではそうではないことが示されています。
以下のコードを詳しく見てみましょう:
#include
using namespace std;
void pr()
{
cout これはわかります。技術的には pr() 関数を呼び出しません。代わりに、関数ポインタが cout に渡されます。このプロセス中に関数ポインタが bool に変換されると、ゼロ以外の値が true と評価される論理式と同様に動作します。これは、出力されると 1 に変換されます。
さらに、C 11 より前の標準では、関数ポインターのストリーミングを許可するオーバーロードは存在しません。このため、std::cout を使用して関数ポインターを直接フォーマットして出力することが困難になります。ただし、C 11 の出現により、これを実現するためにカスタム オーバーロードを定義できるようになりました。
template
std::ostream & operatorこのオーバーロードを採用すると、cout
(func_ptr=)(num_args=0)
このカスタムオーバーロードは、さまざまなアリティの関数ポインターを出力する例を示します。関数ポインターの問題は軽減されますが、目的のオーバーロードの指定が不可欠となる、オーバーロードされた関数または関数テンプレートに関係するシナリオを完全に解決するわけではありません。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3