C++中的每个表达式都有非引用类型吗

2023-11-22

您好,我正在阅读有关 C++ 中的表达式和整个语句的内容

声明0.0

每个表达式都有一些非引用类型

引用的语句来自 en.cppreference.com/w/cpp/language/value_category。检查页面顶部的第 2 行。

现在我举了一些例子来理解这意味着什么。例如:

int i = 100; // this expression has type int
int &j = i; // this expression has type int or int&?

我的困惑是,我知道 j 是对 int 的引用,即 j 是 int& 但根据引用的语句,每个表达式都有一个非引用类型将意味着int &j = i;具有 int 类型。它是否正确? 我感到困惑的其他例子:

int a[4] = {2,4,4,9};
a[3]; // will this expression be int& type or int type?

现在在声明中a[3];我知道 a 是一个数组左值,因此 a[3] 返回对最后一个元素的左值引用。但令人困惑的是引用的语句 0.0 是否意味着整个表达式a[3];是 int 还是 int& 类型?

这是另一个例子:

b[4]; // Here assume that b is an array rvalue. So will this expression has  type int&& or int?

所以我的问题是指针也会发生类似的情况吗?这意味着我们对于指针也有类似的声明(0.0)吗?

int x = 34;
int *l = &x; // will this expression have type int* or int?

我现在这里 l 是一个指向 int(复合类型)的指针。如果对于指针没有类似的声明,那么对于引用还需要这个声明吗?这就是为什么我们只去掉参考部分?


int i = 100; // this expression has type int
int &j = i; // this expression has type int or int&?

这些陈述根本不是表达。这些是声明。它们确实包含子表达式 100 和i,两者都有类型int。如果您使用 id 表达式j在此声明之后,该表达式的类型将是int.

所以我的问题是指针也会发生类似的情况吗?

不会。指针是非引用类型,类似的情况不会发生在具有指针类型的表达式上。

为什么我们只去掉参考部分?

这就是语言的工作原理。它允许我们以相同的方式对待对象和对象的引用。

这就是为什么您不需要(也不能)显式使用间接运算符来访问引用的对象,这与需要使用间接运算符来访问指向的对象不同。


这是实际的语言规则(来自最新的标准草案):

[表达式类型]

如果表达式最初具有“对 T 的引用”类型([dcl.ref]、[dcl.init.ref]),则在任何进一步分析之前将类型调整为 T。 表达式指定引用所表示的对象或函数,并且表达式是左值或x值,具体取决于表达式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中的每个表达式都有非引用类型吗 的相关文章

随机推荐

  • 仅计算最后一个指数加权移动平均 pandas

    我知道 对于熊猫来说 通过这样做 test df ewm halflife half life for mean mean 我可以随时得到指数移动平均线 然而我实际上只对最后一个感兴趣 我怀疑通过计算所有它可能有点低效 换句话说 我所需要的
  • TFS 2010 - 在完成“撤消挂起的更改”后,有什么方法可以恢复我的更改吗?

    完成 撤消挂起的更改 后 有什么方法可以恢复我在本地计算机中所做的更改吗 我认为这是不可能的 但我仍然想知道是否有人知道一种方法 如果你有not在 撤消挂起的更改 之后构建您的项目 您可以在 Reflector 中打开 dll 并复制正确的
  • “__get__”参数之一是否多余? [复制]

    这个问题在这里已经有答案了 正如这里所描述的 https docs python org 3 reference datamodel html object get 传递给 get 方法的两个参数 self 除外 分别是访问属性的对象和类
  • Fluent Assertions 可以对 IEnumerable 使用字符串不敏感的比较吗?

    我有一对列表 我正在尝试使用流畅的断言进行比较 我可以轻松地编写比较代码 但我想使用 Fluent Assertions 以便我可以获得在测试失败消息中显示的原因 到目前为止我所看到的所有内容似乎都使用默认的 Object Equals 比
  • 如何将 JRUBY_OPTS 与 RVM 一起使用?

    似乎在基于 RVM 的 Rails 项目中向 JRuby 提供标志的惯用方法是设置环境变量 JRUBY OPTS 或 PROJECT JRUBY OPTS 后者可能是自动完成的 因为我看到我可以从项目目录中取消注释这一行 rvmrc PRO
  • 如何以不同用户身份运行 nohup 而不生成两个进程?

    我试图 nohup 一个命令并以不同的用户身份运行它 但每次我这样做都会生成两个进程 例如 nohup su s bin bash nobody c my command gt outfile txt 这肯定以无人身份运行 my comma
  • pytest 是否应该从虚拟环境中的依赖模块收集测试?

    我正在尝试在另一台笔记本电脑上设置一个项目 而不是我的典型开发机器 这个项目有几个基于 pytest 的测试 是我在项目的整个生命周期中编写的 当我跑步时 pytest k tests my test py 我从 sqlalchemy 测试
  • 使用默认值从 SelectList 创建 DropDownListFor

    我有一个dropdownlistfor Html DropDownListFor model gt model Item Item Status new SelectList Model AllStatus id Description n
  • 在 dc.js 中向饼图添加图例

    我正在构建一个基于 dc js 的可视化 其中一个图表是饼图 看 http jsfiddle net luiseth t8we6 我的情况的特殊性在于 该图表将显示的标签通常相当长 以至于通常会被图表的容器 div 所以我想到让它们出现在图
  • Objective-C 查找方法的调用者

    有没有办法确定某个代码行method是从哪里打电话来的 堆栈我希望这有帮助 NSString sourceString NSThread callStackSymbols objectAtIndex 1 Example 1 UIKit 0x
  • 如何从Matlab中的regionprops(Image,'BoundingBox')获取矩形子图像?

    我在较大的图像中识别出了一些粒子 并且需要将每个粒子解析为较小的图像 我已经使用了regionprops BoundingBox 函数 但还没有成功 现在如何使用 BoundingBox 制作图像 I 的矩形子图像 我可以使用 Boundi
  • C++,防止在堆栈上创建类实例(在编译期间)

    我知道有一些方法可以通过阻止用户使用来防止在堆上创建类new and delete操作员 我正在尝试做相反的事情 我有一个类 我想阻止用户在堆栈上创建它的实例 并且只有使用new运算符将编译 更具体地说 我希望以下代码在编译期间收到错误 M
  • Java方法描述符中美元符号的含义?

    例如 它是 Jikes RVM 堆栈的一部分 at 0x70cfba90 0x708cfaa4 Lorg apache lucene index SegmentInfos access 000 Ljava lang String V at
  • 数字值包含逗号——如何使这些数字成为数字? [复制]

    这个问题在这里已经有答案了 我有一整列数字 其中包含数千个逗号分隔符 当我尝试用它们创建一个数字列时 任何超过 999 的值都会变得不适用 我使用了cbind df lt cbind df var2 as numeric as charac
  • 为 JAX-RS 2.0 客户端 API 配置代理

    我有一个在 Java EE 7 应用程序服务器 WildFly 上运行的应用程序 它使用 REST 资源查询另一个服务 在以前的应用程序中 我使用了 Jersey 1 x 客户端 API 对 REST 服务的访问是通过 Web 代理授予的
  • Google 缩放以适合该页面上的所有标记

    我很难弄清楚这一点 我查看了这里和互联网上的示例 但仍然无法使其工作 我有一张 Google v3 地图 其中显示了英国各地的许多标记 我希望能够设置缩放级别以覆盖所选区域中的所有标记 例如 伦敦可能有 50 个标记 格拉斯哥可能有 2 个
  • C++ 中是否有多态性的替代方案?

    The CRTP在这个关于动态多态性的问题中提出了建议 然而 据称这种模式仅对静态多态性有用 我正在考虑的设计似乎受到虚拟函数调用的速度阻碍 因为这里暗示了 甚至 2 5 倍的加速就已经很棒了 所讨论的类很简单 可以完全内联编码 但是直到运
  • 禁用网页上的所有滚动

    我想知道是否可以禁用网页上的所有滚动 我目前正在使用 html body overflow hidden 问题是这在 iOS 设备上不起作用 如果你按住鼠标滚轮并将其向下拖动 你也可以滚动 所以这似乎是一个非常糟糕的问题解决方案 有没有办法
  • Java如何处理内存中的String对象?

    我被问到这个问题 String s abc creates one String object and one reference variable In this simple case abc will go in the pool a
  • C++中的每个表达式都有非引用类型吗

    您好 我正在阅读有关 C 中的表达式和整个语句的内容 声明0 0 每个表达式都有一些非引用类型 引用的语句来自 en cppreference com w cpp language value category 检查页面顶部的第 2 行 现