2

次のコードsnippletは、'std :: is_constructible <A、int>'を実装しようとします。

#include <type_traits>

struct A { 
  // A(int);
};

template< typename T >
struct cstr_int
{
  static int mi;

  template< typename C >
  static typename std::enable_if< 
    std::is_same< decltype( T( mi ) ), T >::value, char >::type choose( C * );
  static long choose( ... );

  enum { value = ( sizeof( decltype( choose( & mi ) ) ) == 1 ) };
};

bool const b1 = cstr_int< A >::value;

g ++を使用すると、これは正常に機能します。clang ++を使用すると、次のエラーが出力されます。

tmp/sfinae04.cc:14:29: error: no matching conversion for functional-style cast from 'int' to 'A'
    std::is_same< decltype( T( mi ) ), T >::value, char >::type choose( C * );
                            ^~~~~
tmp/sfinae04.cc:20:17: note: in instantiation of template class 'cstr_int<A>' requested here
bool const b1 = cstr_int< A >::value;
                ^
tmp/sfinae04.cc:3:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const A' for 1st argument
struct A { 
       ^
tmp/sfinae04.cc:3:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'A' for 1st argument
struct A { 
       ^
tmp/sfinae04.cc:3:8: note: candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided
1 error generated.

バージョン情報:clangバージョン3.3(trunk 172418)(llvm / trunk 172417)、g ++(Debian 4.7.2-4)4.7.2。

私の質問: 私見これはSFINAEでなければなりません。ここで何かが足りないのですか、それともclang ++に問題がありますか?

(is_constructible()があることは知っていますが、それを使用することは許可されていません。それは私の質問のポイントではありません。)

4

1 に答える 1

6

置換の失敗のように見えるかもしれませんが、実際にはテンプレートのインスタンス化中に検出された失敗であり、したがって診断可能なエラーです。

推定されるテンプレートパラメータに依存しないため、これはSFINAEコンテキストではありません。enable_if

これは機能します:

template< typename T >
struct cstr_int
{
  static int mi;

  template< typename C >
  static typename std::enable_if< 
    std::is_same< decltype( C( mi ) ), C >::value, char >::type choose( C * );
  static long choose( ... );

  enum { value = ( sizeof( decltype( choose( (T*)0 ) ) ) == 1 ) };
};
于 2013-01-14T18:09:48.813 に答える