У меня есть следующий код С++ 17:
template <typename Callback = void(*)()>
struct A {
A(Callback c = &noop) {}
private:
static void noop() {}
};
int main() {
A a{};
}
Clang 6 компилирует это без каких-либо ошибок, но GCC 8.2 говорит:
In function ‘A(Callback)-> A<Callback> [with Callback = void (*)()]:
3:24: error: ‘static void A<Callback>::noop() [with Callback = void (*)()] is private within this context
A(Callback c = &noop) {}
^~~~~
5:14: note: declared private here
static void noop() {}
^~~~
Интересно, что если Callback
- это не аргумент шаблона, а простой псевдоним типа (т.е. Если я пишу, using Callback = void (*)()
внутри класса A
), оба компилятора в порядке. Кроме того, если вместо A a{};
Я явно пишу A<> a{};
, оба компилятора снова прекрасны. Это заставляет меня думать, что эта проблема каким-то образом связана с новым механизмом вычитания шаблона класса С++ 17.
Мой вопрос: кто из компиляторов прав в соответствии со стандартом? Является ли это ошибкой GCC или Clang является слишком разрешительным?