首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【笔记】《深入理解C++11》(下)

    define而提出的编译期常量, 在表达式面前加上constexpr来声明 编译器会在编译时期对constexpr进行值计算, 类似模板元编程 constexpr可以在函数前声明, 但是C++11的时候常量表达式函数有很多限制...C++11的时候: 函数体只能有单一的return语句(或者额外的不影响数据的编译期语句) 函数必须返回值, 因为一定要从常量表达式中获得常量 函数使用前(编译期)一定要有定义 返回语句中不能有非常量的函数或数据...注意此时类的构造函数函数体必须为空, 所有成员都只能依靠常量表达式在初始化列表中初始化 常量表达式不能用于virtual 常量表达式函数不需要重写非常量版本, 编译器会自动生成, 重写反而会报错 当模板函数声明为常量表达式后..., 如果函数的实例化结果不满足常量表达式要求, 那么常量表达式符号会被忽略而不会报错(也是一种SFINAE) 变长模板 C标准中的变长宏不强调类型并不安全 C++11中的tuple模板就是典型的变长模板...std::aligned_union()则针对union处理, 选择类型中对齐最严格的一个值返回 通用属性 C++ 中的属性 https://docs.microsoft.com/zh-cn/cpp/

    1.1K31

    C++核心准则编译边学-F.21 如果需要返回多个输出值,最好返回结构体或者tuple

    否则无名的tuple会更适合一般的代码。 译者注:tie是C++11导入的新特性,可以用于解构tuple元素。...return make_tuple(status, something()); } 译者注:类似的返回多值的做法在其他语言(例如Python)中已经广泛使用。...我们通过(非常量)引用传递cin以便控制它的状态。我们传递s以避免重复申请内存。通过重用s(通过引用传递),我们只是在需要扩充s的容量时重新申请内存。...这个例子可以看做抽象之外的另一种包含明确意义的情况。...应该使用返回值代替输出参数。输出参数可以是函数写入动作的对象,调用一个非常量成员函数,或者作为一个非常量传递。

    55630

    C++11 在析构函数中执行lambda表达式(std::function)捕获this指针的陷阱

    lambda表达式是C++11最重要也最常用的一个特性之一。lambda来源于函数式编程的概念,也是现代编程语言的一个特点。...我想说的是善用lambda表达式,将给C++编程带来极大的便利,这是本人最近学习C++11以来真实深切的感受,但是有时候误用lambda表达式也会给编程带来极大的隐患,本文以最近的经历说明lambda表达式在使用上的一例陷阱...test_lambda_base 类的功能很简单,就是在析构函数中执行构造函数传入的一个std::function对象。...因为问题的原因不是lambda表达捕获的this指针不对,而是在基类的析构函数中,lambda表达式所捕获的this指针所指向的子类对象部分的数据已经无效,不可引用了。...我同样用前面在std::function析构函数加断点的方式在eclipse+gcc环境下做了测试,测试结果表明gcc也是按C++标准顺序执行对象析构的,但不同的是gcc在构造下面这个lambda表达式时

    1.7K10

    C++11知识点总结(全面解析C++11经常考到的知识点)

    C++11简介 相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言...C++11中,std::move()函数位于 头文件中,该函数名字具有迷惑性,它并不搬移任何东西,唯一的功能就是将一个左值强制转化为右值引用,然后实现移动语义。...C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含头文件。...get_id()的返回值类型为id类型,id类型实际为std::thread命名空间下封装的一个类,该类中包含了一个结构体: // vs下查看 typedef struct { /* thread...11.5.1 Mutex的种类 在C++11中,Mutex总共包了四个互斥量的种类: 1. std::mutex C++11提供的最基本的互斥量,该类的对象之间不能拷贝,也不能进行移动。

    2.1K10

    c++11新特性,所有知识点都在这了!

    这里的详细介绍请看:左值引用、右值引用、移动语义、完美转发,你知道的不知道的都在这里 列表初始化 在C++11中可以直接在变量名后面加上初始化列表来进行对象的初始化,详细介绍一定要看这篇文章:学会C++...nullptr nullptr是c++11用来表示空指针新引入的常量值,在c++中如果表示空指针语义时建议使用nullptr而不要使用NULL,因为NULL本质上是个int型的0,其实不是个指针。...char *const ptr; // 指针本身是常量 const char* ptr; // 指针指向的变量为常量 在函数参数中使用const,一般会传递类对象时会传递一个const的引用或者指针,这样可以避免对象的拷贝...c++11中是不是方便了许多,而不需要定义一个对象,在计算对象的成员大小。...::array:数组,在越界访问时抛出异常,建议使用std::array替代普通的数组 std::tuple:元组类型,类似pair,但比pair扩展性好 typedef std::tuple<int,

    20.8K24

    【翻译】C++17的新特性简介

    Lambda中捕获的this只能是引用形式的。...现在我们可以使用*this(C++17)得到对当前对象的一个拷贝,而用this(C++11)则会继续捕获目标的引用 struct MyObj { int value {123}; auto getValueCopy...,就是现在允许了当expr是一个类似tuple的对象时可以用auto [ x, y, z ] = expr;来初始化,对象中的元素会被绑定到x,y和z上 类似tuple的对象包括std::tuple,...= 12.0 std::optional 标准库模板类std::optional(可选项)维护了一个可选的包含值,例如,一个可能存在也可能不存在的值。...新的文件系统库std::filesystem提供了在文件系统中控制多文件,多目录,多路径的标准方法 就像下面例子,在有可用空间的情况下将一个大文件拷贝到一个临时路径中 const auto bigFilePath

    3.1K10

    C++中auto关键字的用法详解

    4.auto的好处 在C++中因为类,命名空间等语法会出现如std::mapstd::string, std::string>::iterator这样的特别长的类别,若单纯用typedef来简略代码则会出现新的麻如...return 0; } 所以auto无疑是十分不错的选择 5、auto在C++14和C++17的更新 C++的auto关键字最初在C++11中引入,主要用于自动类型推导,使编程更简洁。...下面详细介绍这些更新: C++14中对auto的更新 返回类型推导: 在C++14中,auto可以用于推导普通函数的返回类型。...::cout std::endl; } 在这个例子中,fixed_multiply函数模板接受一个类型为T的值和一个auto类型的常量N,然后返回乘积。...在实例化时,N的类型会根据提供的常量自动推导。 结构化绑定: C++17还引入了结构化绑定,这允许使用auto来解构数组、结构体和tuple,从而更容易地访问复合数据类型的元素。

    38510

    C++(STL):02---tuple容器

    在C++11标准之前,tuple最多带有10个类型不同的元素 C++11,tuple被重新定义,采用variadic template概念,被设计为可用于任意大小的异质集合 二、tuple概述 tuple...到了C++11之后,有了variadic template概念,tuple被重新定义,格式如下,其可以接受任意数量的实参 ? 支持的操作 tuple定义在头文件tuple>中 ?...但是tuple容器成员数目是不限制的,因此我们必须使用get标准库函数模板来访问tuple中的元素 为了使用get,我们必须指定一个显式模板实参,用来指出要访问第几个成员,成员索引从0开始 get返回指定成员的引用...中)来影响make_tuple()产生的类型 例如: std::string s; auto x = std::make_tuple(s); //以s的非引用创建一个tuplestd...如果未找到,则两个迭代器相等,表示空范围 下面我们编写一个函数,对于一本给定的书,在files中搜索出售过这本书的书店 对每家有销售记录的,返回一个tuple类型,保存这家书店的索引和两个迭代器(索引指出书店在

    1.3K20

    常见问题之Golang——在Go中返回的中文文本中包含菱形问号乱码

    常见问题之Golang——在Go中返回的中文文本中包含菱形问号乱码 背景 日常我们开发时,会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家...,让其还在深坑中的小伙伴有绳索能爬出来。...同时在这里也欢迎大家把自己遇到的问题留言或私信给我,我看看其能否给大家解决。...开发环境 系统:windows10 语言:Golang golang版本:1.18 内容 错误 在Go中返回的文本中包含菱形问号乱码 这是一个��测试������文本 造成原因: byte转中文时出现多余的...byte没有有效解析为中文导致 解决方案: str := "这是一个测试文本" str2 := []rune(str) fmt.Println(string(str2[:])) // 进行处理后的结果

    1.6K20

    C++11常用新特性快速一览

    但事实上我们并不知道 add() 这个函数会做什么样的操作,获得一个什么样的返回类型。 在 C++11 中这个问题得到解决。...对于引用捕获方式,无论是否标记 mutable,都可以在 lambda 表达式中修改捕获的值。至于闭包类中是否有对应成员,C++ 标准中给出的答案是:不清楚的,与具体实现有关。...元组 std::tuple 元组的使用有三个核心的函数: std::make_tuple: 构造元组 std::get: 获得元组某个位置的值 std::tie: 元组拆包 #include tuple...一般使用正则表达式主要是实现下面三个需求: 检查一个串是否包含某种形式的子串; 将匹配的子串替换; 从某个串中取出符合条件的子串。...C++98 标准库中提供了一种唯一拥有性的智能指针 std::auto_ptr,该类型在 C++11 中已被废弃,因为其“复制”行为是危险的。

    2.6K50

    【Example】C++ 标准库常用容器全面概述

    capacity 返回在不分配更多的内存的情况下vector可以包含的元素数。(当前内存空间) cbegin 返回指向vector中起始位置的常量迭代器。...back 返回对list中最后一个元素的引用。 begin 返回list中指向起始位置的迭代器。 cbegin 返回list中起始的位置的常量迭代器。...序列以允许查找、插入和移除任意元素的方式表示,并包含与序列中的元素数量无关的多个操作(常量时间),至少在所有存储桶长度大致相等时如此。...(在std::multimap中不提供) begin 返回一个迭代器,此迭代器指向Map起始位置。 cbegin 返回一个常量迭代器,此常量迭代器指向Map起始位置。...序列以允许查找、插入和移除任意元素的方式表示,并包含与序列中的元素数量无关的多个操作(常量时间),至少在所有存储桶长度大致相等时如此。

    3.4K30

    C++11动态模板参数和type_traits

    它至少能用于 表达式 解引用表达式 批量自增和自减 sizeof表达式 sizeof…表达式(这个表达式返回的是动态模板的参数个数) new和delete操作符 type declare(类型声明,比如上文例子中的...但是基于它已经可以实现出比较复杂的功能。 接下来我们来尝试用动态模板参数简单地实现boost和c++11里的tuple(多元组)。 实现简单多元组(tuple) tuple是stl中pair的补充。...实际上,支持C++11动态模板参数的STL里的tuple也是这种实现方法,只不过额外还会有一些功能性函数和解决权限问题的函数而已。...正如这里面所看到的。bind的数据保存也用了tuple。但是这里有一个问题,执行时要把绑定时的list按顺序解引用。这怎么实现呢?...index值 最后在解引用的时候使用_Index…,必然是由0到目标个数的一次累加 这时候,_Index就可以用到tuple的get函数里了。

    57920

    C++11动态模板参数和type_traits

    它至少能用于 表达式 解引用表达式 批量自增和自减 sizeof表达式 sizeof…表达式(这个表达式返回的是动态模板的参数个数) new和delete操作符 type declare(...但是基于它已经可以实现出比较复杂的功能。 接下来我们来尝试用动态模板参数简单地实现boost和c++11里的tuple(多元组)。 实现简单多元组(tuple) tuple是stl中pair的补充。...实际上,支持C++11动态模板参数的STL里的tuple也是这种实现方法,只不过额外还会有一些功能性函数和解决权限问题的函数而已。...正如这里面所看到的。bind的数据保存也用了tuple。但是这里有一个问题,执行时要把绑定时的list按顺序解引用。这怎么实现呢?...操作符获取到index值 最后在解引用的时候使用_Index…,必然是由0到目标个数的一次累加 这时候,_Index就可以用到tuple的get函数里了。

    1.8K20

    C++ 的发展

    在 C++0x 的过程中,许多新的特性开始得到提出和采纳,如 自动类型推导、右值引用、lambda 表达式、并发编程 等。C++11 的标准化过程历时多年,经历了大量的讨论和修改。 4....性能优化:通过右值引用和移动语义,C++11 使得许多数据传输和复制操作得以高效地优化,特别是在容器和大型对象的操作中,性能大幅提升。...Lambda 表达式的返回类型推导: 在 C++14 中,Lambda 表达式可以通过 auto 关键字自动推导返回类型。这避免了在 Lambda 表达式中手动指定返回类型的需要。...在 decltypeAuto() 中,returnRvalue() 返回一个右值引用,通过 decltype(auto) 可以正确地推导出返回类型。...这个特性非常适合替代try-catch块来进行错误处理,尤其是在函数返回时希望包含更多的错误信息时。

    61810

    《C++11》深入理解元组(Tuple)

    在C++11中,元组(Tuple)作为一种新的数据结构被引入,它允许我们将多个不同类型的值组合在一起。元组的引入极大地增强了C++的灵活性和表达能力,尤其是在需要返回多个值或处理不同类型数据时。...本文将详细探讨C++11中的元组,包括其定义、用法、优缺点、实际应用示例以及一些高级用法和注意事项。什么是元组?元组是一种固定大小的集合,可以包含不同类型的元素。...与数组或向量不同,元组的元素可以是不同类型的,这使得它在处理多种数据时非常方便。元组的基本定义在C++中,元组是通过std::tuple类模板来定义的。...实际应用场景元组在许多场景中都非常有用,以下是一些常见的应用:返回多个值:在函数中返回多个相关值,例如从数据库查询中返回多个字段。...元组的比较元组的比较操作符是基于元素的顺序和类型进行的,因此在比较时要确保元组的结构一致。总结C++11中的元组(std::tuple)是一种灵活且强大的数据结构,适用于多种场景。

    14710

    【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr

    1.5 -> 传值、传引用效率比较 值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率非常低下...4 -> 基于范围的for循环(C++11) 4.1 -> 范围for的语法 在C++98中要遍历一个数组通常用的方法为: #include using namespace std...迭代的对象要实现++和==的操作 5 -> 指针空值nullptr(C++11) 5.1 -> C++98中的指针空值 在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误...在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下,将其看成一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。...注意: 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的; 在C++11中,sizeof(nullptr)与sizeof((void*)0)所占的字节数相同

    15310
    领券