为什么带有模板参数的 C++ 函数在 clang++ 7 上不警告 "control reaches the end of a non-void function"?

why doesn't a C++ function with template arguments warn "control reaches the end of a non-void function" on clang++ 7?

我注意到如果我编译这个

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

这是编译器中的错误吗?

除非您调用(或以其他方式使用)该函数模板特化并对其进行实例化,否则实际生成的 函数 不存在,并且您不会得到任何关于除非它在语法上无效。

我们看不到您程序的其余部分,因为您认为可重现的示例不重要,但大概您没有在程序中这样做。

在您的主函数中写入 x<int>();,您将看到您想要的警告。