Неоднозначная специализация шаблонов с понятиями и реальными типами: какой компилятор прав? ⇐ C++
-
Anonymous
Неоднозначная специализация шаблонов с понятиями и реальными типами: какой компилятор прав?
Рассмотрим следующий код:
#include шаблон недействительный foo() { } шаблон недействительный foo() { } шаблон void foo() { } int main() { foo(); } Он компилируется без проблем в последних версиях Clang и MSVC, но не в GCC (ссылка на godbolt)
Сборка с помощью GCC завершается неудачей:
ошибка: неоднозначная специализация шаблона 'foo' для 'void foo()' 9 | void foo() { } | ^~~~~~~~~ примечание: кандидаты: 'template void foo()' 3 | недействительный foo() { } | ^~~ примечание: 'template требует интеграла< > void foo()' 6 | недействительный foo() { } | ^~~ Какой компилятор прав? Я бы сказал, что GCC неправ, поскольку не должно быть никакой двусмысленности между специализацией через концепцию (которая сохраняет код общим) и фактической явной специализацией пользователя, которая всегда должна иметь приоритет.
Рассмотрим следующий код:
#include шаблон недействительный foo() { } шаблон недействительный foo() { } шаблон void foo() { } int main() { foo(); } Он компилируется без проблем в последних версиях Clang и MSVC, но не в GCC (ссылка на godbolt)
Сборка с помощью GCC завершается неудачей:
ошибка: неоднозначная специализация шаблона 'foo' для 'void foo()' 9 | void foo() { } | ^~~~~~~~~ примечание: кандидаты: 'template void foo()' 3 | недействительный foo() { } | ^~~ примечание: 'template требует интеграла< > void foo()' 6 | недействительный foo() { } | ^~~ Какой компилятор прав? Я бы сказал, что GCC неправ, поскольку не должно быть никакой двусмысленности между специализацией через концепцию (которая сохраняет код общим) и фактической явной специализацией пользователя, которая всегда должна иметь приоритет.
Мобильная версия