首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动演绎和模板类型演绎有什么区别?

自动演绎和模板类型演绎有什么区别?
EN

Stack Overflow用户
提问于 2019-02-01 09:48:37
回答 2查看 681关注 0票数 6

让我们有以下代码

代码语言:javascript
复制
    auto x = { 11, 23, 9 }; 
    template<typename T> // template with parameter
    void f(T param); 

    f({ 11, 23, 9 }); // error! can't deduce type for T

在下面的代码中,auto是自动推导的,而模板不是自动推导出来的。

  • auto类型是如何推导的?
  • 幕后的auto类型是什么?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-01 09:52:37

auto类型演绎通常与模板类型演绎相同,但auto类型演绎假定带括号的初始化器表示std::initializer_list,而模板类型演绎则不表示std::initializer_list

当用带括号的初始化器初始化auto-declared变量时,推导的类型是std::initializer_list的实例化。但是,如果传递相应的模板相同的初始化程序,类型扣减将失败,代码将被拒绝:

代码语言:javascript
复制
auto x = { 11, 23, 9 }; // x's type is     
                       //std::initializer_list<int>
template<typename T> // template with parameter
void f(T param); // template with parameter

但是,如果在模板中指定param是某个未知T的std::initializer_list<T>,则模板类型推断将推断T是什么:

代码语言:javascript
复制
template<typename T>
void f(std::initializer_list<T> initList);
f({ 11, 23, 9 }); // T deduced as int, and initList's
 // type is std::initializer_list<int>

记住

  • 自动类型扣减通常与模板类型演绎相同,但自动类型演绎假定带括号的初始化器表示std::initializer_list,而模板类型演绎则不表示。
票数 6
EN

Stack Overflow用户

发布于 2019-02-01 10:01:54

自动类型演绎对列表初始化采用不同的规则。对于复制列表初始化,模板参数P被认为是std::initializer_list<U>.

(强调地雷)

参数p如下:在T中,包含auto的变量的声明类型,每次auto的出现都被替换为假想类型的模板参数U或,如果初始化是复制列表初始化,则用std::initializer_list<U>.替换为。参数A是初始化表达式。

那么对于auto x = { 11, 23, 9 };x的类型将是std::initializer_list<int>

对于直接列表初始化,规则是不同的:

在直接列表初始化(但不在复制列表-initalization中)中,当从大括号-init-列表中推导出汽车的含义时,带括号的-init-列表必须只包含一个元素,并且auto的类型将是该元素的类型: auto x1 = {3};// x1是std::initializer_list auto x2{1,2};//错误:没有单个元素自动x3{3};// x3是int // (在N3922 x2和x3都是std::initializer_list之前)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54476870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档