Рассмотрим следующий фрагмент:
struct S {
S() {}
template<typename B>
struct T {
T(B &&) {}
};
template<typename B>
T(B &&) -> T<B>;
};
int main() {
S::T t{0};
}
Clang принимает его, а GCC отклоняет код со следующей ошибкой:
prog.cc:10:5: ошибка: руководство по выводу 'S :: T (B &&) → S :: T' должно быть объявлено в области пространства имен
Это действующий код? Какой компилятор прав, GCC или Clang?