Руководства по дедукции, шаблоны и подобъекты: какой компилятор прав?

Рассмотрим следующий фрагмент:

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?

Ответы

Ответ 1

Согласно http://en.cppreference.com/w/cpp/language/class_template_argument_deduction

Определяемые пользователем руководства по вычитанию должны указывать шаблон класса и должны вводиться в пределах той же семантической области шаблона класса (который может быть пространством имен или охватывающим классом), а для шаблона класса участников должен иметь один и тот же доступ, но руководства по выведению не становятся членами этой сферы.

Таким образом, clang кажется правильным.