LoginSignup
5
4

More than 5 years have passed since last update.

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

Posted at

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

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」へ書き換えたため「?」となって数時間ハマってしまいました。

以上、小ネタでした。

5
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4