Как предоставить руководство по вычитанию для вложенного шаблона?

Согласно [temp.deduct.guide/3]:

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

Но ниже пример не компилируется в [gcc] и [clang].

#include <string>

template <class>
struct Foo {
    template <class T>
    struct Bar {
        Bar(T) { }
    };
    Bar(char const*) -> Bar<std::string>;
};

int main() {
    Foo<int>::Bar bar("abc");
    static_cast<void>(bar);
}

Каков правильный синтаксис руководства по вычитанию для вложенного шаблона? Или, может быть, это правильно, но пока не поддерживается компиляторами?


Подобный синтаксис, но без компиляции вложенных классов отлично и в gcc и clang:
#include <string>

template <class T>
struct Bar {
    Bar(T) { }
};
Bar(char const*) -> Bar<std::string>;

int main() {
    Bar bar("abc");
    static_cast<void>(bar);
}

Ответы

Ответ 1

[temp.deduct.guide] включает предложение:

Руководство по вычитанию должно быть объявлено в той же области, что и соответствующий шаблон класса, и для шаблона класса участников с тем же доступом.

Это говорит о том, что ваш пример должен работать. Руководство по вычитанию явно поддерживается для шаблонов классов участников, если они объявлены в той же области и доступе (что будет областью класса и public - проверить и проверить).

Это gcc ошибка 79501 ​​ (подана Ричардом Смитом).