2015年4月15日水曜日

GCC/g++ >= 4.9.0 C++11スタイルの関数シグニチャーが virtual メンバー関数の引数に現れると翻訳時エラーとなる問題とその安易な回避方法

次のコードは執筆現在までに wandbox で確認できる GCC/g++ >= 4.9.0 で翻訳時エラーを生じる。

template< typename T > struct t;

class a
{
  virtual auto f( t< void () > ) -> void;
  virtual auto g( t< auto () -> void > ) -> void;
};

auto main() -> int { }

g++-4.9.2 (compile error):

prog.cc:6:16: error: implicit templates may not be 'virtual'
   virtual auto g( t< auto () -> void > ) -> void;

g++-HEAD-20150413 (compile error):

prog.cc:6:22: error: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
   virtual auto g( t< auto () -> void > ) -> void;
                      ^
prog.cc:6:16: error: implicit templates may not be 'virtual'
   virtual auto g( t< auto () -> void > ) -> void;

GCC/g++ < 4.9.0 または clang++ 3.7.0-trunk-234752, 3.6.0, 3.5.0, 3.4 ではこの問題は発生しない。

a::fa::g は等価で、問題の発生する GCC/g++ >= 4.9.0 でも次のように簡単に回避するコードを工夫することはできた。

template< typename T > struct t;

class a
{
  using s = auto () -> void;
  virtual auto f( t< void () > ) -> void;
  virtual auto g( t< s > ) -> void;
};

auto main() -> int { }

これはどうもバグのような気がするので、 GCC の Bugzilla へ報告すると、どうやらGCCのツワモノたちが突っつきだしてくれたのでそのうち直ると嬉しい。

すでに、ほぼ状況発生原因の特定は速やかに進んだようだ。ありがたいヽ(´ー`)ノ

0 件のコメント:

コメントを投稿