почему функция C ++ с аргументами шаблона не предупреждает «элемент управления достигает конца функции, не являющейся пустым» в clang ++ 7? - PullRequest
0 голосов
/ 12 апреля 2020

Я заметил, что если я скомпилирую это

int x() { }

, я получаю предупреждение, как обычно:

$ clang++-7 -pthread -std=c++17 -o main main.cpp
main.cpp:5:11: warning: control reaches end of non-void
      function [-Wreturn-type]
int x() { }
          ^
1 warning generated.

$ ./main

однако, если функция принимает какие-либо аргументы шаблона:

template <typename y>
int x() { }

предупреждения не появляются.

$ clang++-7 -pthread -std=c++17 -o main main.cpp
$ ./main

Это ошибка в компиляторе?

1 Ответ

2 голосов
/ 12 апреля 2020

До тех пор, пока вы не вызовете (или иначе не воспользуетесь odr) специализацией шаблона функции, создав его экземпляр, действительная результирующая функция не существует, и вы не получите никакой диагностики об этом, если она не синтаксически недействительна .

Мы не можем видеть остальную часть вашей программы, поскольку вы не думали, что воспроизводимый пример важен, но, вероятно, вы не делали этого в своей программе.

Напишите x<int>(); в своей главной функции, и вы увидите предупреждение, которое вы хотели.

...