返回类型为T的函数模板无法编译

Naw*_*waz 5 c++ gcc templates function-templates

以下代码编译正常:

template<typename T>
void f(const T &item) { return; }

int main() 
{
  f("const string literal");
}
Run Code Online (Sandbox Code Playgroud)

汇编在ideone上成功:http://ideone.com/dR6iZ

但是当我提到返回类型时,它不会编译:

template<typename T>
T f(const T &item) { return item; }

int main() 
{
  f("const string literal");
}
Run Code Online (Sandbox Code Playgroud)

现在它给出了错误:

prog.cpp:6:错误:没有匹配函数来调用'f(const char [21])'

代码:ideone:http://ideone.com/b9aSb

即使我创建了返回类型const T,它也不会编译.

我的问题是:

  • 为什么不编译?
  • 返回类型与错误和函数模板实例化有什么关系?

Eri*_*rik 14

您无法从函数返回数组,因此模板实例化失败,并且没有匹配的函数.

由于SFINAE,你得到这个特殊的错误- 编译器无法实例化你的函数并不是一个错误,这一个没有匹配函数的错误.

可以返回对数组的引用 - 返回T const &将起作用.

编辑:回应评论:

首先,这实际上是SFINAE的一个很好的例子.

template<typename T> T f(const T &item) { return item; }
char const * f(void const * item) { return 0; }
int main() {
  f("abc");
}
Run Code Online (Sandbox Code Playgroud)

当编译器编译它时,它将首先尝试实例化模板化的f,以创建该类型的精确匹配const char [3].由于上述原因,这失败了.然后它将选择不精确的匹配,普通函数,并在调用中衰减const char [3]到a const char *.