2017-11-25 10 views
0
Foo x(Bar()); 

別の関数の中に書き込むことができ、コンパイルできます。どうして? また、関数宣言がその署名の中に一時オブジェクトを取得する方法はありますか?これはC++で有効な関数宣言ですか?

+0

それは一時ではありません。オブジェクト。それは何も得られず、返しますBar – RiaD

+0

@Peterあなたは確かにですか? https://ideone.com/Vgg6Ia – RiaD

+0

@Peterあなたは間違っています。 – melpomene

答えて

3

さて、あなたはこれを行うことができます。

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 *); 
+0

なぜグローバルスコープだけでなく、別の関数の内部で宣言できますか?しかし、関数に本体を追加したいときにエラーが出る – TheLogicGuy

関連する問題