首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Effective Modern C++翻译(2)-条款1:明白模板类型推导

可以使用的语境,类型推导的普遍应用将程序员从必须拼写那些显然的,多余的类型的暴政中解放了出来,它使得C++开发的软件更有弹性,因为在某处改变一个类型会自动的通过类型推导传播到其他的地方。...中推导出T和ParamType的类型 第一种情况:ParamType是一个指针或是一个引用,但不是一个万能引用(universal reference) 最简单的情况是当ParamType是一个指针或是一个引用...,比如,这个参数的类型被推导为一个指向const的引用,这就是为什么向带有一个T&参数的模板传递一个const对象是安全的,对象的常量性(constness)成为了推导出的类型T的一部分。...T param); // param现在是按值传递的 这意味着param将会是传递过来的对象的一个拷贝,一个全新的对象,事实上,param是一个全新的对象控制导出了T从expr中推导的规则 像之前一样...当模板的参数是万能引用(universal reference)时,左值的实参产生左值的引用,右值的实参产生右值的引用。 模板的参数是按值传递的时候,实例化的表达式的引用性和常量性将被忽略。

791100
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Modern c++快速浅析

    模板类型推导 模板类型推导中最重要的是弄清它什么时候会抛弃引用,什么时候会抛弃常量性 •template void func(T& param);在这个示例函数中,如果传递进是一个...,那么T和param推导出来的类型都是int如果传递进的是一个const char* const的指针,那么T和param推导出来的类型都是const char*,顶层const被忽略。...decltype(auto) 上文中提到auto作为返回值时将采用模板类型推导的规则,正因为如此它可能会遗失一些我们需要的类型(如引用或常量性),这个时候就需要使用decltype(auto) template...constexpr constexpr代表编译期常量,它所标识的值可能被放入到只读内存段中,如数组,非类型模板参数,枚举类型等要求的都是编译期常量,const代表运行期常量。...新增了constexpr的用途,可以用在_if-else_语句中,称作_if-constexpr_,常用于模板元编程中。

    20410

    《Effective Modren C++》 进阶学习(上)

    某些情况下,ParamType并不是和函数参数类型一样,而是依据参数推导出的(划重点) 使用模板: template void f(ParamType param); // ParamType...类型推导如下进行: 如果expr是左值,T和ParamType都会被推导为左值引用。 第一,这是模板类型推导中唯一一种T和ParamType都被推导为引用的情况。...)(int, bouel) 「小结」 在模板类型推导时,有引用的实参会被视为无引用,他们的引用会被忽略 对于通用引用的推导,左值实参会被特殊对待 对于传值类型推导,实参如果具有常量性和易变性会被忽略...与auto不同的是: auto在推导时会丢弃const和引用,decltype则可以保留类型的const和引用限定符,即推导出的类型与表达式的类型一致。 4....constexpr常量可以在编译时被用作常量表达式,例如作为数组大小、模板参数或其他需要常量表达式的上下文中使用。这样可以提高代码的灵活性和可读性。 编译时错误检查。

    20320

    【c++入门】引用详解 | auto的类型推导 | 范围for循环 | nullptr空指针

    前言 上篇文章中,对函数重载和内联函数的作用和特性使用,进行了精细的详解。 引用和指针混不清?引用的抽丝剥茧!还有不用写类型可以自动推导的关键字?for遍历竟然还有我们没见过的面孔!...☁️引用的概念 语法 : 类型& 引用变量名(对象名) = 引用实体; 从图中我们可以看出b不仅和a的值相同,地址也是一模一样!这是为什么?...void foo(auto x); // 错误,auto 不能用于函数参数的类型声明 ⭐模板参数 模板参数的类型是在实例化时确定的,编译器无法在编译时推导出模板参数的类型。...template void foo(auto x); // 错误,auto 不能用于模板参数的类型声明 ⭐类成员变量 类成员变量的类型是在类定义时确定的,编译器无法在编译时推导出类成员变量的类型...nullptr 和 NULL 是不同的。nullptr 是一个空指针常量,而 NULL 是一个整数常量。 在 C++11 中,推荐使用 nullptr 来表示空指针,以提供更好的类型安全性。

    24710

    const 使用总结

    它可以用于任何函数或者类之后的全局或namespace的变量,也可以用于文件、函数、块作用域、类中的static变量,也可以用于修饰成员函数、函数的参数、模板参数。...const和指针与引用一样,指针也可以指向常量或非常量,指向常量的指针不能用于修改其所指对象的值,常量对象的地址只能存放于指向常量的指针中:const int i = 1024;int *p = &i;...顶层const和底层const顶层const(top-level const)表示指针本身是个常量,底层const(low-level const)表示所指的或所引用的对象是个常量。...const时,明确指出当auto和引用一起使用时,初始值中的顶层const属性会被保留,因为引用是绑定这个对象的,相当于是这个对象的别名,所以这个对象的const属性应该要保留:int i = 0;const...,非常量引用不能绑定到字面值const auto &ri = 0;// OK decltype处理顶层const和引用的方式和auto有些不同,顶层const和引用都会得到保留:const int ci

    13210

    Effective Modern C++翻译(4)-条款3:了解decltype

    我们从典型的例子开始,因为它的结果都是在我们预料之中的,和模板类型推导与auto类型推导相比(参见条款1和条款2),decltype几乎总是总是返回变量名或是表达式的类型而不会进行任何的修改 const...问题源于我们使用的是模板类型推导规则,它会丢弃初始化表达式中的引用限定符。...typename Container, typename Index> decltype(auto) authAndAccess(Container& c, Index i); 容器是以一个左值的非常量引用传入的...,因为返回一个容器中元素的引用允许我们来修改这个容器,但这意味着我们不可能传递一个右值的容器到这个函数中去,右值是无法绑定到一个左值的引用上的(除非是一个的常量左值引用,但本例中不是这样的) 无可否认,...C++14提供了decltype(auto)的支持,比如auto,从它的初始化式中推导类型,但使用decltype的推导规则。

    80590

    四、从C语言到C++(四)

    // ... } 常量引用(Constant Reference): 常量引用用于确保不能通过引用来修改所引用的值。...在模板函数中,使用T&&形式的参数可以接收左值或右值,然后根据传递的实参类型推导出正确的引用类型。...移动构造函数和移动赋值运算符:通过定义移动构造函数和移动赋值运算符,我们可以实现资源的移动。这些函数使用右值引用作为参数,从源对象中获取资源,并将其“移动”到目标对象中。...定义 完美转发允许函数模板将其参数“完美”地转发给另一个函数,同时保持参数的原始类型和值类别(左值或右值)不变。 2. 关键点 右值引用和模板类型推导:完美转发通过使用右值引用和模板类型推导来实现。...总结 常引用用于保护数据不被修改,常用于函数参数。 右值引用用于支持移动语义和完美转发,可以提高程序的性能和灵活性。

    7810

    深入解析C++的auto自动类型推导

    = 1.0; // d为double 变量i将被推导为int类型,变量d将被推导为double类型,这时是根据“=”右边的表达式的值来推导出auto的类型,并将它们的值复制到左边的变量i和d中,因为是将右边...尽管ci是有const修饰的常量,但是变量i的类型是int类型,而非const int,因为此时i拷贝了ci的值,i和ci是两个不相关的变量,分别有不同的存储空间,变量ci不可修改的属性不代表变量i也不可修改...(2)语句中auto被推导为const int,ci的类型为const int &,因为ci是对cx的引用,而cx是一个const修饰的常量,因此对它的引用也必须是常量引用。...(2)语句中的crx是个常量引用,它和(1)语句的情况一样,这里只是复制它所引用的对象的值,它的const属性跟变量j没有关系,所以变量j的类型为int。...>类型,因此编译器会拷贝m中的所有元素到临时对象,然后再让p引用到这些临时对象,每迭代一次,临时对象就被析构一次,这就导致了无故拷贝了那么多次对象和析构临时对象,效率上当然会大打折扣。

    37820

    Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型

    另一种是经验主义者,他们探索条款1-3所描述的推导规则,并且从大量的推导情景中确认他们预测的结果(对于这段代码,我认为推导出的类型将会是…),但是有时候,他们只是想简单的回答如果这样,会怎么样呢之类的问题...他们可能想知道如果我用一个万能引用(见条款26)替代一个左值的常量形参(例如在函数的参数列表中用T&&替代const T&)模板类型推导的结果会改变吗?...假如我们想要知道上一个代码中的x和y被推导出的类型,我们首先声明却不定义一个模板,代码会像下面这样: template // 只有TD的声明; class TD; // TD...::type_info::name处理的类型是被按照按值传递给模板对待的,像条款1解释的那样,这意味着如果类型本身是一个引用的话,引用部分是被忽略掉的,如果引用去掉之后还含有const,常量性也将被忽略掉...reasonable approach),但是如果你更喜欢那些移植性不是很强的但是能轻易实现并且提供的结果比typeid更好的代码的, 你需要注意到很多编译器都提供了语言的扩展来产生一个函数签名的字符串表达,包括从模板中实例化的函数

    72480

    每个C++开发者都应该学习和使用的C++11特性

    使用auto关键字声明变量时,编译器会根据变量的初始值自动推导出其类型。 下面是auto的一些重要特点和用法: 类型推导: 使用auto关键字可以根据变量的初始值推导出变量的类型。...: auto特别适用于模板编程,因为它可以自动推导出模板类型。...在传统的 C++ 中,空指针可以用 NULL 宏或者字面常量 0 表示。...1. begin() 和 end() 函数: 这两个函数被定义在 头文件中,它们通常用于访问容器的起始迭代器和结束迭代器,例如: std::vector vec = {1...static_assert 可以用于模板编程、泛型编程中对类型或常量表达式进行静态检查,帮助程序员在编译时发现潜在的问题,提高代码的可靠性和稳定性。 2.

    7810

    如何引用jstage OA的文章(How to recommendcite jstage OA articles)

    引言 写论文时想引一篇OA文章,发现导出参考文献没有gb/t7714,于是看看别人是怎么引用的(请EndNote RIS, bibtex用户忽略本文,因为jstage能导出它们) 下载pdf拖到zotero...里是看不到文献引用标记的,而且在知网百度谷歌学术等文献网站上导出不了其引用或者导出很怪 少数jstage的文章是知网上有的,但是合作刊物,范围太小 e.g.知网找到的英文引用 "[17]Hiroshi...本推奨基準は,記事データの訂正・修正等について,記事のさまざまな版について,巻・号・ページ・発行年について,和文誌・和英混載誌の誌名英文字表記について,引用文献の書き方について,の各項目からなっている。...この推奨基準の目的と概要について述べた。...然后 填入模板author1[,author2[,author3[,et el]]].title[J].journal,year,volume(number):pagefrom-pageto 日本的英文作者名可以写缩写

    3.5K30

    c++:动态库接口函数返回stl对象的设计原则塈‘__acrt_first_block == header’异常

    std::string是STL中定义的模板类,所以编译器在编译动态库时会将std::string实例化,在编译exe时也会将其实例化,也就是说有两套std::string实例代码分别在exe和dll中....解决方案 知道了原因,就可以推导出解决问题的关键在于不能让exe去析构dll返回的std::string,简单的办法就是在dll中定义一个只包含一个std::string类型成员的class A,test...: /* 封装的资源对象,外部不可修改 */ T _resource; }; /* raii_dll */ 请注意为了确保dll返回的对象不会被赋值为exe的内存对象,这里get()返回的是常量引用...dllimport) # endif # else # define GAX_API # endif #include #include "raii_dll.h" // 实例化并导出模板...,就可以传递复杂类型: 动态库设计接口时,应该避免直接返回stl类型,如果不可避免(比如本例),就封装将其成一个类返回(可以照搬本文的方法) 动态库接口函数的输入/出参数如果是class,应尽量设计为常量引用

    4.5K30

    C++ 11 新特性

    如果表达式为左值或者被 () 包围,推导出来的是表达式类型的引用 骚操作: 返回类型后置 /** * @brief 阻塞等待 set_value * @return ret_type */ auto...= _list.end(); ++it){ std::cout << i; } 包装器和绑定器 右值引用 左值:放在内存、有明确存储地址(可以取地址)的数据 右值:可以提供数据值的数据(不可以取地址...、原始字面量和 lambda 表达式等 纯右值 (prvalue, PureRvalue): 与右值引用相关的表达式,比如,T&& 类型函数的返回值、 std::move 的返回值等 右值引用: class...,出大问题;Test &&t = GetTest(); 就没毛病 const Test &t = GetTest(); 有点特殊:常量左值引用是一个万能引用类型,可以接受左值、右值、常量左值、常量右值...为什么使用右值引用?

    31510

    C++复习笔记——C++ 关键字

    C++ 中的 bool类型可以和int混用,具体来说就是0代表false,非0 代表 true。bool类型常用于条件判断和函数返回值。...export 为了访问其他编译单元(如另一代码文件)中的变量或对象,对普通类型(包括基本数据类、结构和类),可以利用关键字 extern,来使用这些变量或对象时;但是对模板类型,则必须在定义这些模板类对象和模板函数时...,使用标准 C++ 新增加的关键字 export(导出)。...常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。...它主要有如下几种用法: 用于类层次结构中基类和子类之间指针或引用的转换。

    1.3K30

    C++の自动类型推导和其他

    例如, template auto add(T t, U u) { return t + u; } C++有模板的概念,代码中所示模板就是实现两个对象t和u的加法,...= pred_boxes.end(); pred_box++) { pred_box->push_back(batch_id); } 这是我从caffe框架中截取的一段代码,先不管其含义,仅仅关注auto...常量限定符const与 constexpr 讲完了自动类型推导,接下来说一下C++中与常量定义相关的两个关键词 const 和 constexpr。...(1)const的用法 const与引用一起使用 在C++中const会经常与引用一起使用,如下: const int i = 512; const int &j = i; 这里i与j都是常量,i是整型常量...b = newfun(); 在这两个例子中,编译器在编译时会检查k+1和newfun()是否是常量表达式(函数),如果不是,上面的定义就不成立,编译会失败。

    66410

    技术◈C++核心知识总结(I)

    例如, template auto add(T t, U u) { return t + u; } C++中有模板的概念,代码中所示模板就是实现两个对象t和u的加法...= pred_boxes.end(); pred_box++) { pred_box->push_back(batch_id); } 这是我从caffe框架中截取的一段代码,先不管其含义,仅仅关注auto...常量限定符const与 constexpr 讲完了自动类型推导,接下来说一下C++中与常量定义相关的两个关键词 const 和 constexpr。...(1)const的用法 const与引用一起使用 在C++中const会经常与引用一起使用,如下: const int i = 512; const int &j = i; 这里i与j都是常量,i是整型常量...b = newfun(); 在这两个例子中,编译器在编译时会检查k+1和newfun()是否是常量表达式(函数),如果不是,上面的定义就不成立,编译会失败。

    76030

    万字避坑指南!C++的缺陷与思考(上)

    (一)数组 数组本身其实没有什么问题,这种语法也非常常用,主要是表示连续一组相同的数据构成的集合。但数组类型在待遇上却和其他类型(比如说结构体)非常不一样。...: int &&r1 = 5; // 右值引用绑定常量 和const引用一样,常量没有地址,没有存储位置,只有值,因此,要把这个值保存下来的话,同样得按照“新定义变量”的形式,因此,当右值引用绑定常量时...: auto &&r1 = 5; // 绑定常量,推导出int &&int a;auto &&r2 = a; // 绑定变量,推导出int &int &&b = 1;auto &&r3 = b...; // 右值引用一旦绑定,则相当于普通变量,所以绑定变量,推导出int & 由于&比&&优先级高,因此auto &一定推出左值引用,如果用auto &绑定常量或将亡对象则会报错: auto...都是模板,因此,传入左值和传入右值的可能性都要有的,我们没法在f2中再强制std::move了,因为这样做会让左值变成右值传递下去,我们希望的是保持其左右性 但如果不这样做,当我向f2传递右值时,右性无法传递下去

    1.6K50

    右值引⽤与移动语义

    左值和右值 在C++中,左值(lvalue)和右值(rvalue)是两种不同的表达式类型,它们的主要区别在于它们在内存中的状态和使用方式。...通常用作右值引用的绑定对象,以实现移动语义。 例子: int b = 30; // 'b' 是一个左值。...引用折叠 什么是引用折叠? 引用折叠指的是当我们使用模板和类型别名(typedef)时,组合不同类型的引用会产生新的引用类型。...引用折叠的应用示例 函数模板 在函数模板中,T&& 是一种万能引用(或转发引用),根据传入的参数类型,**T**** 会推导为左值引用或右值引用**。...// b 是 const 左值,推导出 T 为 const int&,引用折叠,模板实例化为 void Function(const int& t) // 因为 t 是 const 引用

    13510

    【C++11】{}右值引用移动语义类型分类引用折叠完美转发--C++

    ,例如:临时变量,字面量常量,存储于寄存器中的变量等,也就是说左值和右值的核心区别就是能否取地址。...从汇编底层的角度看下面代码中r1和rr1汇编层实现,底层都是用指针实现的,没什么区别。底层汇编等实现和上层语法表达的意义有时是背离的,所以不要然到一起去理解,互相佐证,这样反而是陷入迷途。...而不是像拷贝构造和拷贝赋值那样去拷贝资源,从提⾼效率。...7、引用折叠 C++中不能直接定义引用的引用如 int& && r = i; ,这样写会直接报错,通过模板或 typedef 中的类型操作可以构成引用的引用。...下面的程序中很好的展示了模板和typedef时构成引用的引用时的引用折叠规则,大家需要一个一个仔细理解一下。

    5400
    领券