C++
小ネタ

[C++][小ネタ] クラスの構築

More than 1 year has passed since last update.

小ネタです。この間、非常にくだらないことでドハマリしてしまいました。

class A
{
public:
    A() {}
    A(int) {}
};

void foo()
{
    A a1;           // パターン1
    A& r1 = a1;     // OK

    A a2 = A();     // パターン2
    A& r2 = a2;     // OK

    A a3(1);        // パターン3
    A& r3 = a3;     // OK

    A a4();         // パターン4
    A& r4 = a4;     // Error
}

みなさんは、ぱっと見でパターン4の何がエラーなのか、おわかりになりますか?

自分は最初 armcc でこの問題に遭遇したのですが、"Error" の行で型が違うとだけしか表示されず、さんざん悩んでしまいました。

パターン4の a4 は、実はこれ、関数宣言として解釈されているんですね。
つまり、最初の A が戻り値で、a4 が関数名と。

いくつかのコンパイラで試しましたが、

gcc、armcc ... a4 の型が違うというエラーのみ。
msvc ... 'A (__cdecl *)(void)' から変換できません、というエラー。
clang ... "パターン4"の行でこれ関数として解釈しますよという warning と、() を消せば変数として解釈しますよという note と、"Error" の行のエラーを表示。

となっていました。clang が丁寧w

わかっている人には当たり前のことなのでしょうけど、自分は「パターン3」から「パターン2」を思い浮かべながら「パターン4」へ書き換えたため「?」となって数時間ハマってしまいました。

以上、小ネタでした。