2 に答える
a
ではありませんint
: パラメータを持たず、 を返す関数ですint
。関数宣言であるためa
、ローカル変数でもなく、「デフォルト値」を持ちません。
関数を定義せずに (挿入式でそのアドレスを取得することによって)使用a
しようとしているため、プログラムの形式が正しくありません。したがって、1 つの定義規則に違反します。
a
プログラムで定義する1
と、関数のアドレスがa
に変換されるため、 が出力されbool
ます。パラメーターoperator<<
を持つオーバーロードはbool
、関数ポインターの引数の型に最適です。
[注: a
Visual C++ で定義してコンパイルすると、 ではなく、関数のアドレスが出力されます1
。これは (私が思うに) Visual C++ では関数ポインターを暗黙的に に変換できるためvoid*
、パラメーターoperator<<
を持つオーバーロードがvoid const*
関数ポインターの引数の型に最適であるためです。言語拡張機能を無効にしてコンパイルすると ( /Za
)、bool
パラメーターを含むオーバーロードが期待どおりに選択されます。]
James McNellisがあなたがintを宣言していないと言っているように、あなたは関数を宣言しているのです。
ただし、次のようなデフォルト値で初期化されたintを取得できます。
int i = int();
また、デフォルト値は1ではなく0です。
std::cout << "this prints '0': " << int() << '\n';
C ++ 11では、均一な初期化を使用できます。
int i {};
中括弧は、括弧のように関数宣言の一部と混同されることはありません。