什么是自动扣和模板类型推演之间的区别?

问题描述 投票:4回答:2

让我们有下面的代码

    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类型?
c++ templates auto
2个回答
7
投票

auto类型推演通常是相同的模板类型推演,但auto类型推演假定一个支撑初始化表示std::initializer_list和模板类型推演没有。

auto声明的变量与一个支撑初始化初始化,推导的类型是std::initializer_list的实例化。但是,如果相应的模板传递相同的初始化,类型推演失败,并且代码被拒绝:

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

但是,如果在模板中指定参数是某些未知T A std::initializer_list<T>,模板型扣将演绎T是什么:

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和模板类型推演没有。

1
投票

Auto type deduction采取不同的规则列表初始化。随着副本列表初始化,模板参数P被视为std::initializer_list<U>

(重点煤矿)

在T,声明的类型,其包括自动可变的,自动的每次出现替换假想类型模板参数U或,如果初始化是复制列表初始化,与std::initializer_list<U>:参数P如下获得。的参数A是初始化表达式。

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

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

在直接列表初始化(但不是在复制列表initalization),推断从支撑-初始化列表自动的意义时,该支撑-初始化列表只能包含一个元素,和经销商的类型将是该元素的类型:

auto x1 = {3}; // x1 is std::initializer_list<int>
auto x2{1, 2}; // error: not a single element
auto x3{3};    // x3 is int
               // (before N3922 x2 and x3 were both std::initializer_list<int>)
© www.soinside.com 2019 - 2024. All rights reserved.