최소한의 예는 약간 복잡입니다 Kid
문제에 대해 Parent
일치 약 :이 클래스의 범위에 기능을 constexpr하는 포인터를 전달 부모 템플릿의 매개 변수를 추론 할 학대
prog.cc:7:15: note: candidate template ignored: could not match 'Parent' against 'Kid'
constexpr int operator*(A, Parent<N>*) { return N; }
우리가 코드를 조금 변경하면 더 황당한으로 활용하려면 다음
을struct A { };
template <int>
struct Parent { };
template <int N>
constexpr int operator*(A, Parent<N>*) { return N; }
template <class T>
using ptr = T*;
template <int>
struct Other { };
template <int N>
struct Kid: Parent<N> {
static constexpr int s = A{} * ptr<Kid>{};
};
int main() {
Other<Kid<2>::s>{};
}
[clang]도 코드를 컴파일합니다. 그래서 ... 벌레일까요? 아니면 제 정신이 나기 시작 했나요?
100 % 답변을 도울 수는 없지만, 일반적으로'gcc'는'clang'보다 더 관대하다는 것을 발견했습니다. 반면에 후자는 표준을 좀더 가깝게 따르고 있습니다. 나는 그것이 여기의 경우라고 생각할 것이다. 그러나 인텔 컴파일러는 코드도 허용합니다. – davmac