Руководства по выводу, шаблоны и подобъекты: какой компилятор прав? - PullRequest
0 голосов
/ 30 мая 2018

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

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 Ответ

0 голосов
/ 30 мая 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...