Можете ли вы "удалить" шаблонную функцию во втором объявлении?
Рассмотрим следующий код:
template <typename T> int foo();
template <typename T> int foo() = delete;
это действительный С++ 11?
- GCC (9.1) говорит: да!
- clang (8.0) говорит: нет!
- nvcc (9.2) говорит: нет!
- MSVC (19.20) говорит: да! (в режиме С++ 14 он не поддерживает С++ 11.)
... увидеть все это на GodBolt.
так какие компиляторы верны, а какие компиляторы s @# $% e? :-)
Ответы
Ответ 1
GCC и MSVC имеют ошибку.
[dcl.fct.def.delete]
4... Удаленное определение функции должно быть первым объявлением функции или, для явной специализации шаблона функции, первым объявлением этой специализации...
Который я верю, выступает за конкретизированные декларации и определения также. Поскольку ссылка на удаленную функцию является серьезной ошибкой, она должна быть объявлена как удаленная как можно скорее.