void func(A())を理解する


8

これは私のコードです

#include <iostream>

class A {
public:
    int a = 0;
    A(int i = 0) : a(i) {}
};

void func(A())
{
    std::cout << "Hello" << std::endl;
}

int main()
{
    A(*p)() = NULL;
    func(p);
}

私を混乱させたのは、A()in void func(A())がのコンストラクタでは(*)()なくA に等しいということAです。これはどのように作動しますか?


1
のコンストラクタA()がいつだったかはどういう意味Aですか?
idclev 463035818

関数宣言として解析できるものはすべて関数宣言です。見上げて「最も厄介なの解析を」。正規の重複を見つけることができませんが、類似のものはたくさんあります。
Richard Critten


@ Adrian-ReinstateMonicaおかげで、1つ見つかりました。このQは非常に一般的であるため、投票数の増加を期待していました。
Richard Critten

@RichardCrittenこれは特に他の解析が適用できない(?)関数宣言のコンテキストにあるため、これが最も厄介な解析に関連しているとは思えません。しかし、おそらく私は間違っていますか?
templatetypedef

回答:


9

類推によって推論しましょう。関数を定義した場合

void doSomething(A [137]) {

}

その後、C ++はそれを実際に記述したかのように扱います。

void doSomething(A *) {

}

つまり、関数のパラメーターとして使用すると、C ++が自動的に別の型に置き換えてしまう型がいくつかあります。これは、型を減衰させることで得られる型です。

あなたの場合、A()は引数を取らずにを返す関数のタイプですA。をA()引数として取るC ++関数がある場合、C ++は代わりに関数を入力として受け取り、A (*)()引数をとらずにを返す関数へのポインターを持ちますA。これはA()、C ++では型のオブジェクトを使用できないためです。ただし、へのポインタは使用できますA()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.