Рассмотрим следующее
template <typename T1>
struct OuterFoo {
template <typename T2>
struct InnerFoo {
InnerFoo(T2 v2) {}
};
explicit OuterFoo(T1 v1) {}
};
int main() {
OuterFoo outer_foo{6};
OuterFoo<int>::InnerFoo inner_foo{3};
return 0;
}
https://godbolt.org/z/RjUuWM
clang отказывается компилировать это, заявляя, что «нет жизнеспособного конструктора или руководства по выводам для вывода аргументов шаблона« InnerFoo »» - Gccс другой стороны, компилируется без проблем.
Является ли приведенный пример правильным (как в стандарте) использованием CTAD и здесь ли clang виноват?
Если предоставляется руководство по выводу, clang компилируетхорошо, но gcc не принимает руководство: https://godbolt.org/z/4b-9Cr
template <typename T1>
struct OuterFoo {
template <typename T2>
struct InnerFoo {
InnerFoo(T2 v2) {}
};
// This Template Deduction Guide is required in clang 6
// for the example to compile.
// GCC compiles without this TDG but reports an error
// with it
// "deduction guide ‘OuterFoo<T1>::InnerFoo(T2) -> OuterFoo<T1>::InnerFoo<T2>’
// must be declared at namespace scope"
template<typename T2> InnerFoo(T2 v2) -> InnerFoo<T2>;
// ...but no TDG is required for OuterFoo
explicit OuterFoo(T1 v1) {}
};
int main() {
OuterFoo outer_foo{6};
OuterFoo<int>::InnerFoo inner_foo{3};
return 0;
}
Каково состояние CTAD для классов шаблонов элементов в clang и gcc?Это просто еще не там?