首页 > 后端开发 > C++ > 为什么本示例中的'initializer_list”模板类型推导失败?

为什么本示例中的'initializer_list”模板类型推导失败?

Susan Sarandon
发布: 2024-11-28 18:47:11
原创
762 人浏览过

Why Does Template Type Deduction Fail with `initializer_list` in This Example?

使用initializer_list进行模板类型推导

考虑以下函数:

template<typename T>
void printme(T&& t) {
  for (auto i : t)
    std::cout << i;
}
登录后复制

上述函数需要一个参数具有 begin() 和 end() 成员函数。有多种方法可以使用不同的数据类型调用此函数。例如,我们可以使用 std::vector、std::string、std::array 甚至初始化列表。然而,有一种特殊情况是非法的:

printme({'a', 'b', 'c'});
登录后复制

这行代码将导致编译时错误。为什么会出现这种情况?

模板参数推导失败

只有函数参数类型与提供的参数类型匹配时,模板参数的类型推导才能成功。对于 printme 函数:

  • std::vector、std::string 和 std::array 参数都具有与函数的参数类型相对应的明确定义的类型(例如, std::vector)。
  • 初始化列表参数 ({'a', 'b', 'c'}) 没有明确定义的类型。它是一个与特定类型无关的临时对象。

因此,在初始化列表参数的情况下,编译器无法推导模板参数 T。显式指定模板参数将解决该问题(例如 printme>({'a', 'b', 'c'}))。

auto 的特殊情况

虽然 printme 函数中的初始化列表参数是非法的,但它是有效的使用 auto 来初始化保存初始化列表的变量。这是因为 auto 会将 il 的类型推导为 std::initializer_list,从而允许编译器推导 printme(il) 中的模板参数。

以上是为什么本示例中的'initializer_list”模板类型推导失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板