首页 > 后端开发 > C++ > 为什么 `printme({\'a\', \'b\', \'c\'});` 在 C 模板类型推导中非法?

为什么 `printme({\'a\', \'b\', \'c\'});` 在 C 模板类型推导中非法?

Patricia Arquette
发布: 2024-12-02 20:24:14
原创
424 人浏览过

Why is `printme({'a', 'b', 'c'});` Illegal in C   Template Type Deduction?

带有初始值设定项列表的函数中的类型推导

考虑函数模板:

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

此函数需要一个带有 begin 的类型的参数() 和结束 ()

问题:

为什么下面的调用是非法的?

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

答案:

调用 printme({'a', 'b', 'c'}) 是非法的,因为无法推断模板参数 T。如果不显式指定模板参数,编译器无法确定参数的类型,因为它可以是具有 begin() 和 end() 函数的任何类型。在以下情况下不会出现此问题:

  • 显式模板参数规范:printme>({'a', 'b', 'c'})
  • 带类型推导的参数类型: printme(std::vector({'a', 'b', 'c'}))
  • 使用 auto 推导类型: const auto il = {'a', 'b', 'c'}; printme(il);
  • 显式指定模板参数: printme<:initializer_list>>({'a', 'b', 'c'})

例外的是 auto 被推导为 std::initializer_list,这与从模板参数推导。此行为在 C 11 标准 (§ 14.8.2.5/5) 中明确指定,该标准规定,不会推导作为初始化器列表但不是 std::initializer_list 类型的函数形参的模板实参。然而,标准的§ 7.1.6.4/6 明确支持 auto 推导 std::initializer_list.

以上是为什么 `printme({\'a\', \'b\', \'c\'});` 在 C 模板类型推导中非法?的详细内容。更多信息请关注PHP中文网其他相关文章!

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