首页 > 其他分享 >auto型别推导

auto型别推导

时间:2022-10-03 10:11:34浏览次数:51  
标签:初始化 推导 型别 auto 模板 表达式

auto型别推导

auto型别推导就是模板型别推导。在模板型别推导和 auto型别推导之间可以建立起一一映射,它们之间也确实存在双向的算法变换。

以 rx 为例:

int x = 27;
const auto& rx = x;  // x -> expr,auto -> T,const auto& -> ParamType

上述 auto 表达式可以等效为下面的模板型别推导:

template<typename T>
void func_for_rx(const T& param);

func_for_rx(x);

若要推导 auto 表达式(const auto& rx = x),编译器的行为就仿佛对应声明生成了一个函数模板和一个一次使用对应的初始化表达式针对该函数模板的调用。

关于数组退化指针和函数退化成函数指针,也和函数模板型别推导一致。

但有一个例外情况:大括号初始化表达式的处理方式,是 auto 型别表达式和模板型别推导的唯一不同之处。

auto 会假定用大括号括起的初始化表达式代表一个 std::initializer_list,但模板型别推导不会!

此时,auto 型别表达式和模板型别推导之间的映射关系不成立

// auto 型别推导
auto x = {11, 23, 9};   // auto 型别推导得到:x的型别是 std::initializer_list<int>


// 模板型别推导
template<typename T>
void func(T param);

f({11, 23, 9});         // 错误!无法推导出 T 的型别

        当采用声明的变量使用大括号初始化表达式进行初始化时,推导得到的型别是 std::initializer_list 的一个实例型别;但是如果向对应的函数模板传入一个同样的初始化表达式,类型推导就会失败,代码将不会通过编译。

// 除非在模板型别推导中指定 param 的型别是 std::initializer_list<T>
template<typename T> 
void func(initializer_list<int> param); 

f({11, 23, 9}); // 此时可以推导出 T 的型别

 

特别在 C++ 14 中,在函数返回值或 lamda 表达式的形参中使用 auto,意思是使用模板型别推导而非 auto 型别推导

  • 所以带有 auto 返回值的函数若要返回一个大括号括起的初始化表达式,是通不过编译的;
  • 同样的,用 auto 来指定中 lamda 式的形参型别时,也不能使用大括号括起的初始化表达式;
auto createInitList()     // 编译失败
{
    return {1, 2, 3};     // 无法为完成类型推导
}



std::vector<int> v;
...
auto resetV = [&v](const auto& newValue) { v = newValue; }   // 编译失败
...
resetV({1, 2, 3});

 

标签:初始化,推导,型别,auto,模板,表达式
From: https://www.cnblogs.com/czw-yibao/p/16748644.html

相关文章

  • Autodesk SketchBook Pro for Enterprise 2021 mac(专业草图绘画软件)企业版V8.8.0中
    AutodeskSketchBookProforEnterprise2021mac版中文发布。Autodesk公司开发创作的SketchBookPro2021是一款有趣和直观的喷涂和草图绘画工具,可以将您的电脑变成一......
  • autohotkey实现鼠标中键翻译选中文字
    #SingleInstance,Force#Include<JSON>;JSON库:https://github.com/cocobelgica/AutoHotkey-JSON;参考小海coseahttps://zhuanlan.zhihu.com/p/103357456;todo......
  • AutoDL安装记录
    (可以不配置自己的基础环境即只使用安装pytorch版本的一个步骤,但是PyTorch中torch、torchvision、torchaudio、CUDA 版本的关系必须对应,否则gpu不运行。) 点击终端输......
  • 4个Python推导式相关的开发技巧
    对于数据科学,Python通常被广泛地用于进行数据的处理和转换,它提供了强大的数据结构处理的函数,使数据处理更加灵活,这里说的“灵活性”是什么意思?这意味着在Python中总是有......
  • 模板型别推导
    模板型别推导下面代码表示:函数模板和函数调用(从expr来推导T和ParamType的型别)。template<typenameT>voidfunc(ParamTypeparam);//函数模板的声明func(ex......
  • 误差理论与测量平差基础——例题补充推导
    本次补充推导的是第三章的第六道例题,主要做出的补充推导内容是几个方差计算公式的内容,下面是补充内容  ......
  • Spring源码-autowireByType
    autowireByTypeprotectedvoidautowireByType( StringbeanName,AbstractBeanDefinitionmbd,BeanWrapperbw,MutablePropertyValuespvs){ TypeConverterconve......
  • Spring源码-autowireByName
    autowireByNameprotectedvoidautowireByName( StringbeanName,AbstractBeanDefinitionmbd,BeanWrapperbw,MutablePropertyValuespvs){ String[]propertyNa......
  • Autofac 注入仓储模式
    一、配置Autofac替换内置DI安装Nuget包:Autofac,Autofac.Extensions.DependencyInjectionProgram.cs中CreateHostBuilder方法后加上.UseServiceProviderFactory(newAut......
  • auto与decltype
    auto关键词auto仅仅是一个占位符,在编译器期间它会被真正的类型所替代。使用auto类型推导的变量必须马上初始化,这个很容易理解,因为auto在C++11中只是“占位符”,并......