6

Clang が次のコードを拒否する理由がわかりません。

#include <typeinfo>
#include <exception>

const char* get_name( const std::exception_ptr eptr )
{
  return eptr.__cxa_exception_type()->name();
}

int main() {}

type_infoGCC では問題ありませんが、Clangは不完全な型であると不平を言っています。

$ g++-4.7 -std=c++0x -O3 -Wall -Wextra t.cc -o t
$ clang++-3.2 -std=c++0x -O3 -Wall -Wextra t.cc -o t
t.cc:6:37: error: member access into incomplete type 'const class type_info'
  return eptr.__cxa_exception_type()->name();
                                    ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/exception_ptr.h:144:19: note: forward declaration of
      'std::__exception_ptr::type_info'
      const class type_info*
                  ^
1 error generated.
$ 

質問:どうすれば Clang で修正できますか? または、何か不足していて、Clang がコードを拒否するのは正しいですか?

4

1 に答える 1

5

@HowardHinnant のコメントのおかげで、なんとか問題を解決できました。この問題は、プリプロセッサの出力で明らかになりました。libstdc++ には、宣言される前のものが含ま<exception>れています。これにより、Clang は新しい forward-declaration を想定しました。解決策は違法であるのと同じくらい簡単です。<type_info> std::type_infostd::__exception_ptr::type_info

namespace std { class type_info; }

#include <typeinfo>
#include <exception>

const char* get_name( const std::exception_ptr eptr )
{
  return eptr.__cxa_exception_type()->name();
}

int main() {}

libstdc++ に既にバグ レポートがあるかどうかを確認し、ない場合は作成する必要があるようです。

更新:バグ#56468が GCC 4.7.3+ で修正されました

于 2013-02-26T20:36:46.843 に答える