Foo x(Bar());
別の関数の中に書き込むことができ、コンパイルできます。どうして? また、関数宣言がその署名の中に一時オブジェクトを取得する方法はありますか?これはC++で有効な関数宣言ですか?
Foo x(Bar());
別の関数の中に書き込むことができ、コンパイルできます。どうして? また、関数宣言がその署名の中に一時オブジェクトを取得する方法はありますか?これはC++で有効な関数宣言ですか?
さて、あなたはこれを行うことができます。
Foo x();
これは引数を取らず、Foo
を返す関数x
を宣言します。
私たちは、パラメータを追加することができます。
Foo x(int y, char z);
パラメータは、単に変数宣言(x
、ここz
)です。
私たちは、関数宣言でパラメータ名を省略できます。
Foo x(int, char);
そして、我々は関数としてパラメータを宣言することができます。
ここFoo x(Bar y());
我々は別の関数を取る関数としてx
を宣言y
(引数がなく、Bar
を返します)、Foo
を返します。
は、最後に私たちも、ここではパラメータ名を省略できます。
構文がどのように動作するかだFoo x(Bar()); // a function taking a function
。
意味的には、関数が値の型ではないため、これは無効です。関数をコピーすることはできないので、値渡しすることはできません。これは本当ですが、関数として宣言されたパラメータは黙って、コンパイラによってポインタになるように調整されるというルールがあります:
Foo x(Bar y());
// really means:
Foo x(Bar (*y)());
x
は、(引数を取らないとBar
を返す関数へのポインタを取ります)。
またはパラメータ名なし:
Foo x(Bar());
// same as:
Foo x(Bar (*)());
これは、ポインタへの配列として宣言されたパラメータをオン規則に似ています
Foo x(Bar [42]);
// same as:
Foo x(Bar *);
なぜグローバルスコープだけでなく、別の関数の内部で宣言できますか?しかし、関数に本体を追加したいときにエラーが出る – TheLogicGuy
それは一時ではありません。オブジェクト。それは何も得られず、返しますBar – RiaD
@Peterあなたは確かにですか? https://ideone.com/Vgg6Ia – RiaD
@Peterあなたは間違っています。 – melpomene