请考虑以下代码段:
template<typename...>
struct S;
template<typename R, typename... A, typename... T>
struct S<R(A...), T...> {
template<R(T::* ...M)(A...)>
void f() {}
};
struct A { void f() {} };
struct B { void f() {} };
int main() {
S<void(void), A, B> s;
s.f<&A::f, &B::f>();
}
Clang(3.9)编译它没有错误 GCC(6.2)有一个ICE(实际上是 segfault ):
/data/user/0/com.n0n3m4.droidc/files/temp.c: In function 'int main()':
/data/user/0/com.n0n3m4.droidc/files/temp.c:20:23: internal compiler error: Segmentation fault
s.f<&A::f, &B::f>();
^
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
除了由于 segfault 而我已经向GCC提出问题这一事实外,上述代码是否有效?
换句话说,clang是正确地接受它还是应该被两个编译器拒绝?
Here是向GCC开放的问题。