表达式和变量的 C++ 类型和值类别

2023-12-28

由此link http://en.cppreference.com/w/cpp/language/type,它说

对象、引用、函数(包括函数模板特化)和表达式都具有称为类型的属性

因此考虑到以下情况:

int &&rf_int = 10;

我可以说这个变量rf_int是复合型的对 int 的右值引用.

但当谈到价值类别 http://en.cppreference.com/w/cpp/language/value_category,它特别指出

每个表达式都有一些非参考 type

and

每个 C++ 表达式(一个运算符及其操作数、一个文字、一个variable姓名等)

基于以上两种说法,rf_int可以被视为一个表达式,并且表达式有非引用类型.

现在我真的很困惑。做rf_int have a 参考输入或不输入?在谈论名称的类型(无论是变量还是表达式)时,我们是否必须提供上下文?

更具体地说,当在函数调用中使用变量名时:

SomeFunc(rf_int);

Is rf_int现在考虑一个表达式(因此它是一个 int 类型的左值),还是一个变量(因此它是一个对 int 类型的右值引用的左值)?

EDIT: 一条评论here https://stackoverflow.com/questions/20583531/lvalue-to-rvalue-reference-binding#comment-30793019让我想知道这个问题。


一开始它也让我感到困惑,但让我用一种简单的方式消除了歧义。

表达是可以计算并且必须计算为非引用类型的东西,对吗?
(是的,当然啦!!)

现在我们也知道变量名是左值表达.
(老兄已经进入正题了,别再把表达词加粗了)

好吧,现在有一个问题,当我们说变量时,我们指的是内存中的一个位置。现在我们可以将内存中的某个位置称为表达式吗?不,绝对不是,这完全是荒谬的。

表达式是一个通用术语,我们通过定义一些规则来识别它,任何属于这些规则的东西都是表达式。有必要以这种方式定义它,以便在编译器构建期间理解代码。该规则之一是任何计算结果为值的东西都是表达式。由于从编码角度来看,使用变量名意味着您希望在编译代码时使用实际值,因此我们将该变量名称为表达式。

因此,当他们说变量是表达式时,他们并不是指内存中的变量,而是指变量NAME从编码的角度来看。但是使用术语“变量名称”来区分实际变量(内存中的位置)是荒谬的。这么说“变量是一个表达式”只要你从编码的角度思考就可以了。

现在先回答这个问题:

更具体地说,当在函数调用中使用变量名时:

SomeFunc(rf_int);

Is rf_int现在被认为是一个表达式(因此它是一个左值 类型int),或者一个变量(因此它是一个右值类型的左值 参考int)?

单个变量也是一个表达式。所以这个问题就无效了。

现在来回答这个问题:

基于以上两条语句,rf_int可以被视为一个 表达式和表达式具有非引用类型。

现在我真的很困惑。 rf_int 是否有引用类型?

如果我说呢rf_int是 r 值参考并且rf_int也是一个左值表达.
(哎呀兄弟,这家伙对表情的痴迷)

这是真的,因为如果你执行以下操作,它就会起作用。

int &&rf_int = 10;   // rf_int is an r-value reference 
int &x = rf_int;     // x is an l-value reference and l-value reference can be initialized with l-value expression
cout << x;           //Output will be 10

Now is rf_int表达式或右值引用,它会是什么?答案是两者皆有。这取决于你从哪个角度思考。

换句话说,我想说的是,如果我们认为rf_int作为变量(内存中的某个位置),那么它肯定具有右值引用的类型,但因为rf_int也是一个变量名,从编码的角度来看,它是一个表达式,更准确地说是一个左值表达式,每当您使用此变量进行评估时,您都会得到该值10这是一个int所以我们不得不说rf_int作为表达式的类型是int这是非引用类型。

如果您从编译器的角度思考一下,哪一行代码会计算为引用?没有一个是对的?您可以尝试搜索,如果找到也请告诉我。但这里的要点是表达式的类型并不意味着变量的类型。它表示计算表达式后得到的值的类型。

希望我已经澄清了你的问题。如果我错过了什么,请告诉我。

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

表达式和变量的 C++ 类型和值类别 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan

随机推荐

  • 泛型类的静态成员是否与特定实例相关?

    这更像是一个文档而不是一个真正的问题 这似乎还没有得到解决 除非我错过了 所以这里是 想象一个包含静态成员的泛型类 class Foo
  • 使用 node-soap 创建 SOAP Web 服务

    我遵循了 git repo 的这个例子 https github com vpulim node soap https github com vpulim node soap 问题1 我已经创建了一个服务器 是否需要在回调中创建服务器 据我
  • .NET Core HttpRequest 标头优先级是什么?

    目前我正在做一个http请求发送任务 我知道我们有不同的方法来向请求添加标头 HttpClient DefaultRequestHeaders HttpRequestMessage Headers HttpContent Headers 如
  • Django-1.3 beta 的问题

    伙计们 我非常热衷于学习 django 并在 Django 1 2 上学习了一些 但后来我安装了 1 3 版本 直到我使用命令 python manage py runserver 运行服务器为止 它给出了一个巨大的错误 我想不出解决这个问
  • 粒子系统的性能

    情况 我使用以下技术使用 JavaFX 创建了一个粒子系统 每个粒子都是一个 ImageView 其中包含一个具有径向渐变的 Image 粒子处理循环是一个AnimationTimer 其中粒子列表通过列表的stream parallel
  • Bukkit 传送 - nullPointerException

    我正在尝试使用以下代码将用户传送到他们自己的领域 EventHandler public static void onPortalTravel PlayerPortalEvent event throws Exception if even
  • 屏幕截图中的模板匹配

    我是 Python 新手 但想学一点 所以我决定创建一个程序 与桌面输入的模板匹配 有人能帮忙吗 如何编写与桌面流匹配的模板 import time import cv2 import mss import numpy template c
  • Webpack:Webpack 内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 据我所知 Webpack 是一个用于组织项目中资产的工具 不过 我不明白它内部是如何工作的 看起来有点神奇 是否有某种运行时引擎来解析
  • 可以使用实体框架迁移将 DateTime 字段默认为 GETDATE() 吗?

    我将 EntityFramework Migrations Beta 1 添加到现有的 Code First 应用程序中 该应用程序正在经历一些更改 对于迁移功能以及对我从代码优先 API 生成的表进行更多微调 并遇到 GETDATE 设想
  • Laravel excel 在导入前获取总行数

    直截了当的问题 如何使用 laravel excel 获取电子表格中的总行数 我现在有一个工作计数器 用于记录已处理的行数 在CompanyImport文件 但在开始将行添加到数据库之前我需要总行数 我正在导入的工作表几乎有 100 万行
  • Angular Formly:如何将类添加到包装 div

  • 返回用户的管理员 samaccountname

    我需要创建 AD 中所有活动用户的 CSV 文件 包括直线经理属性 但是我需要直线经理sAMAccountName 不是cn 这是我到目前为止所拥有的 Get ADUser server server ip Filter mail like
  • 如何使用 StaX

    大家好 我是 Java XML 解析领域的新手 我发现 StaX API 可能是我最好的选择 因为我需要读取和写入 XML 文件 好吧 我有一个非常短 应该非常简单 的程序 它 应该 创建一个 XMLInputFactory 并使用它来创建
  • 错误阻止启动:使用 static-html 处理文件时

    错误阻止启动 使用 static html 处理文件时 作为我对流星的介绍 我正在测试分叉包Houston https github com gterrono houston 我运行了以下命令 mkdir tempspace cd temp
  • Python Dask:无法将非有限值(NA 或 inf)转换为整数

    我正在尝试从 postregres 表中捕获一个非常大的结构化表 它大约有 200 000 000 条记录 我在用dask而不是 pandas 因为它更快 当我将数据加载到df它比 pandas 快得多 我正在尝试使用将 dask Data
  • Elasticsearch:组合功能分数

    我对 es 查询的评分为三functions query function score query bool score mode multiply boost mode replace functions f1 f2 f3 所以分数是 f
  • 具有特定 Order By 格式的 SQL 查询 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含以下值的表 OperationCode OperationDesc OperationOrder Repl Remove 1
  • 哪些 .Net Orms 或 MicroOrms 支持异步操作和 PostgreSql

    哪些 ORM 支持异步操作和 postgresql 我更喜欢简单的 MicroOrms 例如 Dapper 和 OrmLite 因为它们似乎具有出色的性能并且非常简单 但据我所知 它们不支持异步操作 也许我错了 但是让所有 IO 绑定操作异
  • 使用 mongoDB 聚合按文本搜索

    我正在尝试对名为的集合进行文本搜索DAFacility在 MongoDB 指南针中 id 62170597b3fa8994a0d9a0c8 author User organizationName TSTT eventName Facili
  • 表达式和变量的 C++ 类型和值类别

    由此link http en cppreference com w cpp language type 它说 对象 引用 函数 包括函数模板特化 和表达式都具有称为类型的属性 因此考虑到以下情况 int rf int 10 我可以说这个变量