特化しようとしているときに、私はこの問題に出くわしtuple_size
/ tuple_element
C ++ 17の構造の結合のためのカスタムクラス。
以下のコードはGCCでコンパイルされますが、clangではコンパイルされません(両方のトランクバージョン、以下のリンクを参照)。
#include <type_traits>
template<typename T, typename... Ts>
using sfinae_t = T;
template<typename T, bool... Bs>
using sfinae_v_t = sfinae_t<T, typename std::enable_if<Bs>::type...>;
template <typename T>
struct Test;
template <typename T>
struct Test<sfinae_v_t<T, std::is_integral_v<T>>> {};
void f() {
Test<int> t;
}
これは、clangによって提供されるエラーです。
<source>:13:8: error: class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list
struct Test<sfinae_v_t<T, std::is_integral<T>::value>> {};
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
Compiler returned: 1
これはどちらかのコンパイラのバグですか、それとも上記のコードはいくつかのUBを呼び出しますか?
gcc
コンパイルするのは驚くべきことです。これはコンパイルしないので...