小ネタです。この間、非常にくだらないことでドハマリしてしまいました。
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」へ書き換えたため「?」となって数時間ハマってしまいました。
以上、小ネタでした。