この関数を印刷すると、出力が常に 1 になるのはなぜだろうと思っています。コードは次のとおりです。
#include <iostream>
using namespace std;
int main() {
int x(int());
cout << x; // 1
}
それは常に1つを出力します。なんで?int はデフォルトで 0 に設定されているため、0 が出力されることを期待していました。では、なぜ 1 なのですか?
この関数を印刷すると、出力が常に 1 になるのはなぜだろうと思っています。コードは次のとおりです。
#include <iostream>
using namespace std;
int main() {
int x(int());
cout << x; // 1
}
それは常に1つを出力します。なんで?int はデフォルトで 0 に設定されているため、0 が出力されることを期待していました。では、なぜ 1 なのですか?
int x(int());
「最も厄介な解析」の場合です。ints ( )のデフォルト値に初期化されたint
( )の宣言だと思います。代わりに、コンパイラはそれを、パラメータをとらず、 (このサイトで説明されている毛むくじゃらの宣言を取得するか、C についてもう少し理解することができますここで型宣言を行います)。int x
int()
int
int
次に、次のことを行います。
cout << x;
x
ここでは関数ポインターに減衰しますoperator<<
が、関数ポインターを取るオーバーロードはありません。の有効なオーバーロードを与える最も単純な暗黙の変換operator<<
は tobool
であり、関数ポインタは 0 ( NULL
) の値を持つことができないため、 に評価されtrue
、1 として出力されます。
そのようなコードがエラーなしでコンパイルされるべきかどうかは完全にはわからないことに注意してください-宣言されているだけで定義されていない関数のアドレスを取得しています。以外のものに評価できないことは事実ですが、原則として、リンカ エラーが発生するはずです (ここではオプティマイザによってマスクされており、実際には使用されていないため、true
への参照が削除されます)。x
あなたが実際に望んでいたのは:
int x=int();
関数は変換さbool
れており、bool
値として出力されています。関数はゼロ以外のアドレスにあるため、変換により。が生成されtrue
ます。
これは、関数からポインタへの変換とそれに続くブール変換で構成される標準の変換シーケンスです。
より良いオーバーロードがないため、シーケンスに従いoperator<<
ます。