Следующий фрагмент отлично компилируется с помощью gcc, icc и msvc (последний вопрос), но отключает лягушку с <source>:6:9: error: calling a private constructor of class 'B<int>'
в отмеченной строке.Тем не менее, он работает нормально для функции бесплатного шаблона, как показано в коде:
struct A {
template<class T>
static void create () {
T();
}
};
template<class T>
void create() {
T();
}
template<typename T>
struct B {
friend void A::create<B>();
friend void create<B>();
private:
B() = default;
};
int main() {
A::create<B<int>>(); // clang trips here
create<B<int>>(); // fine!
}
В чем может быть разница между статическим членом шаблона не-шаблонного класса и функцией свободного шаблона в этом контексте?