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

C++ 中的左值和右值

我认为是时候好好理解他们了,因为这些概念随着C++语言的进化变得越来越重要。 二、左值和右值——一个友好的定义 首先,让我们避开那些正式的定义。在C++中,一个左值是指向一个指定内存的东西。...一个引用是指向一个已经存在的内存位置(global变量)的东西,因此它是一个左值,所以它能被赋值。注意这里的&:它不是取地址操作符,他定义了返回的类型(一个引用)。...但是10 是一个数字常量(numeric constant),也就是一个左值,将它赋给引用与引用所表述的精神冲突。 如果你仔细想想,那就是被禁止的从右值到左值的转换。...} 背后的道理是相当直接的,字面常量10是volatile的并且会很快失效(expire),所以给他一个引用是没什么意义的。如果我们让引用本身变成常量引用,那样的话该引用指向的值就不能被改变了。...前文说到,左值(非const)可以被修改(赋值),但右值不能。但C++11引入的右值引用特性,打破了这个限制,允许我们获取右值的引用,并修改之。

1.8K20

哈希函数如何工作 ?

此示例仅对单个字符的等效值进行哈希处理,这意味着输出将始终与输入相同。 为什么这一切都很重要 我们已经花时间了解了一些确定哈希函数是否良好的方法,但我们没有花任何时间讨论它的重要性。...如果您有一个单词列表并且想要查找所有字谜词,您可以按字母顺序对每个单词中的字母进行排序,并将其用作映射中的键。...如果我们确实决定使用本文开头始终返回 0 的虚拟哈希函数,我们会将所有键值对放入第一个存储桶中。找到任何东西可能意味着我们必须检查哈希映射中的所有值。...如果您曾经将哈希值存储在程序之外(例如文件中),则需要小心了解使用的种子。 总结 我们已经介绍了哈希函数是什么、衡量它好坏的一些方法、它不好时会发生什么,以及它们可能被坏人破坏的一些方法。...哈希函数的范围很广,在这篇文章中我们实际上只触及了表面。我们还没有讨论加密与非加密散列,我们只触及了散列函数的数千个用例中的一个,并且我们还没有讨论现代散列函数实际上是如何工作的。

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

    js WeakMap用法

    创建 可以使用 new 关键字实例化一个空的 WeakMap: const wm = new WeakMap(); 注意:弱映射中的键只能是 Object 或者继承自 Object 的类型,尝试使用非对象设置键会抛出...意思就是,这些键不属于正式的引用,不会阻止垃圾回收。但要注意的是,弱映射中值的引用可不是“弱弱地拿着”的。...只要键存在,键/值对就会存在于映射中,并被当作对值的引用,因此就不会被当作垃圾回收: const wm = new WeakMap(); wm.set({}, 1); set()方法初始化了一个新对象并将它用作一个字符串的键...因为没有指向这个对象的其他引用,所以当这行代码执行完成后,这个对象键就会被当作垃圾回收。然后,这个键/值对就从弱映射中消失了,使其成为一个空映射。...在这个例子中,因为值也没有被引用,所以这对键/值被破坏以后,值本身也会成为垃圾回收的目标。

    2.8K21

    21个Java Collections面试问答

    List是一个有序的集合,可以包含重复的元素。您可以从其索引访问任何元素。该列表更像是具有动态长度的数组。 一个Map是键映射到值的对象。映射不能包含重复的键:每个键最多可以映射到一个值。...10、为什么Iterator没有不移动光标就直接获取下一个元素的方法? 可以在当前Iterator接口的顶部实现它,但是由于很少使用它,因此将它包含在每个人都必须实现的接口中没有意义。...如果这些方法的实现不正确,则两个不同的Key可能会产生相同的hashCode()和equals()输出,在这种情况下,HashMap不会考虑将它们存储在不同的位置,而是将其覆盖并覆盖它们。...用户定义的键类的最佳实践是使其不可变,以便可以将hashCode()值缓存起来以提高性能。不可变的类还确保hashCode()和equals()将来不会更改,这将解决任何可变性问题。...myHashMap.get(new MyKey("Pankaj")); 这就是为什么String和Integer大多用作HashMap键的原因。

    2K40

    C++系列笔记(十二)

    这些内容被组织成结构合理、联系紧密的章节,每章都可在1小时内阅读完毕,都提供了示例程序清单,并辅以示例输出和代码分析,以阐述该章介绍的主题。...• 声明和定义接受非 POD 类型作为输入的函数时,应考虑将参数声明为引用,以免调用函数时执行不必要的复制步骤。...• 务必正确地使用const。理想情况下,get()函数不应修改类成员,因此应将其声明为const函数。同样,除非要修改函数参数包含的值,否则应将其声明为const引用。...• 编写类时,如果其对象将存储在诸如vector和list等容器中,或者被用作映射中的键,务必实现运算符用作默认排序标准。...如果您编写的lambda表达式很长,应考虑转而使用函数对象,即实现了operator()的类,因为函数对象可重用,且只有一个地方需要维护。 • 绝不要认为运算符new肯定会成功。

    1.9K30

    Go语言基础4 - 数据(基本数据结构)

    会返回一个指向新分配的,已置零的切片结构, 即一个指向 nil 切片值的指针。...映射的键(或者叫索引)可以是任何相等性操作符支持的类型, 如整数、浮点数、复数、字符串、指针、接口(只要其动态类型支持相等性判断)、结构以及数组。 切片不能用作映射键,因为它们的相等性还未定义。...{} 类型的变量,但如果将它传递到另一个变参函数中,它就像是常规实参列表了。...初始化 GO 的huaGo的初始化很强大,在初始化过程中,不仅可以构建复杂的结构,还能正确处理不同包对象间的初始化顺序。 常量 常量在编译时被创建,即便函数中定义的局部变量也一样。...每个源文件都可以通过定义自己的无参数 init 函数来设置一些必要的状态。

    77600

    SWIG 官方文档第四部分 - 机翻中文人肉修正

    在这两种情况下,必须满足的条件必须指定为布尔表达式。 在上面的例子中,我们只是确保 sqrt() 返回一个非负数(如果没有,那么它会以某种方式被破坏)。 一旦指定了合约,它就会修改结果模块的行为。...如果您无法避免它们,请先考虑一些简单的解决方案。如果您不能接受一个简单的解决方案,请谨慎行事。...如果您正在使用 eLua 并且已经使用 -elua 或 -eluac 来生成您的包装器,那么宏常量和枚举应该通过一个名为"const"的可循环访问。...在类型映射中,当它将表转换为数组时,它会相应地悄悄更改索引。如果您有一个返回索引的 C 函数,请注意这种行为。 注意:SWIG 也可以以类似的方式支持指针数组。...• 在此是用于输入函数参数 • 出这是从函数的返回类型 • argout 这是一个函数参数,它实际上返回了一些东西 • typecheck 用于确定应该调用哪个重载函数(typecheck的语法与 typemap

    5.4K40

    Dart 语法基础

    方括号中的名称在已记录程序元素的词法作用域中解析。这是一个带有对其他类和参数引用的文档注释示例:/// 一种驯养的南美骆驼科动物(羊驼)。...////// 安第斯文化自前西班牙时代以来就一直将羊驼用作肉类和驮畜。////// 与任何其他动物一样,羊驼也需要吃东西,/// 所以不要忘记用一些 [Food] [feed] 它们。...元数据注释以字符 @ 开头,后跟编译时常量的引用(例如 deprecated )或对常量构造函数的调用。...以下是如何定义一个带有两个参数的 @Todo 注释的示例:class Todo { final String who; final String what; const Todo(this.who...相反,请考虑将接口类型移动到由延迟库和导入文件同时导入的库。Dart 会隐式地将 loadLibrary() 插入到您使用 deferred as 命名空间 定义的命名空间中。

    9210

    保持 Go 模块兼容

    因此,通常最好以兼容的方式更改现有的包。 在这篇文章中,我们将探讨一些引入非破坏性变更的技巧。常见的主题是:添加、不更改或删除。我们还将从一开始就讨论如何设计您的 API 以实现兼容性。...当添加带有合理默认值的新参数时,很容易将它们添加为可变参数。...直接添加到接口是一个破坏性的变化,但是,我们如何在公开的接口上支持新方法呢? 基本思想是用新方法定义一个新接口,然后在使用旧接口的地方,动态检查所提供的类型是旧类型还是新类型。...= 并用作映射键,则整个结构类型也具有可比性。在这种情况下,添加一个不可比较类型的新字段将使整个struct类型不可比较,从而破坏任何比较该结构类型值的代码。...指针类型的用户理解类型的每个值是不同的:如果他们想比较两个值,他们应该比较指针。 如果您正在定义一个打算直接用作值的结构,比如我们的 Point 示例,那么您通常希望它是可比较的。

    1.2K30

    实效go编程--2

    向切片追加东西的想法非常有用,因此有专门的内建函数 append。 要理解该函数的设计,我们还需要一些额外的信息,我们将稍后再介绍它。 二维切片 Go的数组和切片都是一维的。...其键可以是任何相等性操作符支持的类型, 如整数、浮点数、复数、字符串、指针、接口(只要其动态类型支持相等性判断)、结构以及数组。 切片不能用作映射键,因为它们的相等性还未定义。...offset := timeZone["EST"] 若试图通过映射中不存在的键来取值,就会返回与该映射中项的类型对应的零值。 例如,若某个映射包含整数,当查找一个不存在的键时会返回 0。..._, present := timeZone[tz] 要删除映射中的某项,可使用内建函数 delete,它以映射及要被删除的键为实参。 即便对应的键不在该映射中,此操作也是安全的。...在初始化过程中,不仅可以构建复杂的结构,还能正确处理不同包对象间的初始化顺序。 常量 Go中的常量就是不变量。它们在编译时创建,即便它们可能是函数中定义的局部变量。

    89670

    【译】理解C和C++中的左值和右值

    那么到底左值和右值具体是什么含义呢?这即是我在本文想要深入探讨的。 一个简单的定义 本小节旨于提出一个简化版的关于左值和右值的定义,然后在其余小节将逐步准确地丰富这个定义。...一个左值,代表一个在内存中占有确定位置的对象,简言之,左值在内存中有地址; 右值是什么呢?我们这么来定义:非左即右。...C99标准正式地定义了可修改的左值: 一个左值不是数组类型,没有不完全类型,不能有const修饰,如果它是一个结构体或者联合union,则不能有任何用const修饰的成员(包括)。...所有的非数组、非函数或不完全类型都可以转换成右值。 反过来呢?右值可以转换成左值吗?不可以!这会严重违背我们之前对左值的定义!【1】 当然,右值可以通过显式转换成左值。...因为这个引用是const修饰,不能通过引用被修改,所以修改右值是可以的。这样的性质,使得在C++中将一个值的常量引用作为参数传入函数十分常见,这也避免了临时对象不必要的复制和构造。

    1.2K10

    Python 高级教程之探索 Python code object

    如果您编译了等效的 C 函数,您可能会看到类似的机器代码指令序列,例如mov和add。 代码对象不仅包含指令本身,还包含 VM 运行代码所需的一些其他信息。...例如,如果您想在函数中加载第 65537 个单元格变量(为什么要这样做呢?)...这是函数中使用的所有常量的元组,如整数、字符串和布尔值。它由LOAD_CONST操作码使用,它接受一个参数,该参数指示co_consts要从中加载的元组中的索引。...例如,f下面是上面定义的函数的常量co_cellvars: In [34]: print f.func_code.co_consts (None, 3, 一个整数,表示函数将使用的最大堆栈空间量。这是必要的,因为与代码对象关联的 VM 堆栈是在调用代码时预先分配的。因此,如果co_stacksize太低,该函数可能会溢出其分配的堆栈并发生可怕的事情。

    72940

    C++:22 再议const的作用(上)

    同宏定义一样,可以做到不变则已,一变都变 (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 (5) 为函数重载提供了一个参考。 (6) 可以节省空间,避免不必要的内存分配。...编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。 常量与数组的组合有什么特殊吗?...这要看具体情况:如果在非const成员函数中,this指针只是一个类类型的;如果在const成员函数中,this指针是一个const类类型的;如果在volatile成员函数中,this指针就是一个volatile...//一个函数 void f(const int& ) {......}//????? ...... }; 这个程序是正确的,看来上面的结论是错误的。 为什么会这样呢?...A、作为非静态的类成员时; B、用于集合时; C、被取地址时; D、在main函数体内部通过函数来获得值时; E、const的 class或struct有用户定义的构造函数、析构函数或基类时;。

    86920

    AngularDart4.0 指南- 依赖注入 顶

    那么这个可怜的消费者呢? 任何想要汽车的人现在都必须创造三个部分:汽车,发动机和轮胎。 汽车类消费者花钱解决问题。 你需要一些照顾组装这些零件的东西。...这是依赖注入框架发挥作用的地方。 想象一下框架有一个叫做注入器的东西。 你用这个注射器注册一些类,然后找出如何创建它们。 当你需要Car的时候,你只需要让注射器为你准备好,你就可以走了。...它没有任何自己的依赖关系。 如果它有一个依赖呢? 如果通过日志记录服务报告其活动呢? 你会应用相同的构造函数注入模式,添加一个带有Logger参数的构造函数。...)] 第一个Provider构造函数参数是作为定位依赖项值和注册提供者的键的标记。...非类依赖关系 如果依赖性值不是一个类呢? 有时你想注入的东西是一个string,list,map,或者一个function。

    5.7K20

    Dart In Action -Dar的基本数据类型(一)

    以下是定义整数文字的一些示例: int x = 1; int hex = 0xDEADBEEF; 如果数字包含小数,则为双精度数。...以下是定义双精度数字的一些示例: double y = 1.1; double exponents = 1.42e5; 以下是将字符串转换为数字的方法,反之亦然: // String -> int var...许多算术表达式也是编译时常量,只要它们的操作数是编译为数字的编译时常量。(注:这是说如果一个表达式涉及到的变量也是编译时常量,那么表达式也是编译时常量。)...List类型有许多方便的方法来操作列表。 有关列表的更多信息,请参阅泛型和集合。 映射 通常,映射是一个有键和值的对象。 键和值都可以是任何类型的对象。 每个键只出现一次,但您可以多次使用相同的值。...== 'partridge'); 如果您在Map中查找一个不存的键,则会返回null: var gifts = {'first': 'partridge'}; assert(gifts['fifth']

    2.5K20

    期待已久的 JS 原生 groupBy() 分组函数即将到来

    在处理数组时,有时我们需要将其中的项目按照某个特定的属性或条件进行分类或分组。这个过程可能会多次重复,每次都需要编写分组函数或使用像 lodash 这样的库中的 groupBy 函数来完成。...最终,peopleByAge对象包含了按年龄分组的结果,其结构与之前的示例相同。这种方法可以更紧凑和函数式地实现相同的逻辑。 无论使用哪种方式,这段代码确实存在一些重复的模式。...这就意味着你可以使用所有常规的 Map 方法来处理它,就像你处理其他 Map 一样。同时,由于它是一个 Map,你可以从回调函数中返回任何类型的值,而不仅仅是作为键的字符串。...因此,如果您尝试使用这个新对象作为键来检索 Map 中的内容,您将无法成功获取到任何东西。 要成功从 Map 中检索项目,请确保您保留对您想要用作键的对象的引用。...这意味着您需要确保键对象是同一个,而不是一个相似但不同的对象。这是因为在 JavaScript 中,对象的引用是唯一的,只有引用相同才能够准确地从 Map 中检索数据。 什么时候可以用呢?

    1.3K20

    【拓展】未来的JavaScript记录与元组

    这就是为什么在JavaScript中可以用作键的值: 要么按值比较且不可修改(原始值) 要么按标识比较且可修改(对象) 复合原始值的好处 复合原始值有如下好处。...数据的非破坏性更新:如果要修改复合值,由于一切都是不可修改的,所以就要创建一个可修改的副本,然后就可以放心地重用不必修改的部分。...在Map和Set等数据结构中使用:因为两个内容相同的复合原始值在这门语言的任何地方(包括作为Map的键和作为Set的元素)都被认为严格相等,所以映射和集合成会变得更有用。 接下来演示这些好处。...因为对象是按标识比较的,所以在(非弱)映射中用对象作为键几乎没什么用: const m = new Map();m.set({x: 1, y: 4}, 1);m.set({x: 1, y: 4},...假如我们还可以深度、非破坏性地更新那些包含由值类型的类产生的对象的数据,那就更好了。

    66731

    SWIG 官方文档第三部分 - 机翻中文人肉修正

    由于类型映射匹配遵循所有 typedef 声明,因此通过 typedef 映射到原始类型的任何类型的类型或常量引用都将被这些原始类型映射中的一个选择。...然后 typemap 填充这个数组并将它传递给底层的 C 函数。...但是,使用多参数映射,可以将函数转换为更自然的东西。...每个模块都有一个 swig_module_info 结构,如下所示: C++/* 用于存储模块信息的结构 * 每个模块生成一个这样的结构,运行时收集 * 所有这些结构并将它们存储在一个循环链表中。...为了自定义 this 指针处理,在你的类型映射中定位一个名为 self 的变量。self 是 SWIG 用来指代包装函数中的额外参数的名称。

    3.6K30

    【从零开始学深度学习编译器】十六,MLIR ODS要点总结上篇

    剩下的一些要点,在下篇文章给出。欢迎大家交流指正。 1. 为什么要使用ODS来定义Operation 在MLIR中要定义Operation支持用C++直接定义以及基于ODS框架定义两种方法。...它不能用作模板,也不能作为基类去派生子类。 TableGen dag 是一种专门用于有向无环图元素的类型。一个dag类型带有一个操作符和零个或者多个参数。...Operation自动生成的默认构建方法 定义了Operation之后,我们怎么构建呢? ...指令是一种带有可选参数的内置函数。可用的指令有attr-dict,attr-dict-with-keyword,operands,ref等等。 「字面值(Literals)」 。...「Operand adaptors」 对于每个Operation,MLIR会自动生成一个操作数适配器。这个类解决了访问作为列表值提供的操作数而不使用“魔术“”常量的问题。

    1.9K30
    领券