5

以下代码编译良好:

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

int main() 
{
  f("const string literal");
}

在ideone编译成功:http: //ideone.com/dR6iZ

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

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

int main() 
{
  f("const string literal");
}

现在它给出了错误:

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

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

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

我的问题是:

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

2 回答 2

15

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

由于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");
}

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

于 2011-03-15T02:15:18.107 回答
0

看起来好像你告诉它你打算返回一个 T,但实际上你返回了一个 const T&。也许尝试将声明更改为:

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

或者可能将返回值更改为参数的取消引用版本:

template<typename T>
T f(const T& item) { return (*item); }
于 2011-03-15T02:21:41.123 回答