”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 您可以分配给类类型的右值引用吗? 一个悖论的解释。

您可以分配给类类型的右值引用吗? 一个悖论的解释。

发布于2024-11-08
浏览:448

 Can You Assign to Rvalue References of Class Type?  A Paradox Explained.

分配给类类型的右值引用:已解决的悖论

在 C 领域,左值和右值之间的区别至关重要。左值表示具有可以修改的内存位置的对象,而右值则表示不能修改的临时对象或常量。然而,一个有趣的代码片段提出了关于这个基本分歧的问题:

class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // Here lies the enigma!
    return 0;
}

为什么这段代码可以编译?构造函数返回的右值不是短暂的,因此不适合赋值吗?

理解这个悖论的关键在于 C 中的隐式赋值运算符。当没有为类显式定义赋值运算符时,编译器会合成默认赋值运算符。至关重要的是,这个合成运算符在某些情况下可以适用于右值。

这就是显式关键字发挥作用的地方。在给定的示例中,Y 类没有声明赋值运算符,因此编译器会生成一个。 Explicit 关键字可以防止右值的隐式转换,但不会阻止合成赋值运算符应用于右值。

因此,在我们的代码中,合成赋值运算符:

Y& Y::operator=(Y const&);

Y& Y::operator=(Y&);

可以用左侧的右值 Y(1) 调用。即使 Y(1) 是右值,这也允许赋值继续进行。

为了防止对临时对象进行赋值,可以使用引用限定符 (&) 显式声明赋值运算符:

class Y {
public:
    explicit Y(std::size_t num = 0);
    Y& operator=(Y const&) & = default;
};

在这种情况下,赋值运算符将不会被合成,并且尝试分配给右值将导致编译错误。

最新教程 更多>
  • 如何在 MySQL 中将纪元时间戳转换为人类可读的日期?
    如何在 MySQL 中将纪元时间戳转换为人类可读的日期?
    在 MySQL 中将纪元时间戳转换为人类可读的日期在 MySQL 中,纪元时间戳是日期和时间的数字表示形式。它是自 Unix 纪元(即 1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数。要将纪元时间戳转换为人类可读的日期,您可以使用 from_unixtime( ) 功能。该函数...
    编程 发布于2024-11-09
  • 如何使用 Pip 获取可用软件包版本列表:综合指南
    如何使用 Pip 获取可用软件包版本列表:综合指南
    如何使用 Pip 获取可用包版本列表:综合指南Pip 是一个广泛使用的 Python 包安装程序,提供了一个安装和管理 Python 包的有效方法。虽然它允许方便地安装特定的软件包版本,但在选择最佳版本之前可能有必要探索所有可能版本的综合列表。本文深入探讨了如何在各种 pip 版本中实现此目的。Pi...
    编程 发布于2024-11-09
  • ## **`std::vector::erase`返回的迭代器在删除后是否指向有效元素?**
    ## **`std::vector::erase`返回的迭代器在删除后是否指向有效元素?**
    std::vector 迭代器失效:详细解释std::vector 中迭代器失效的概念经常被讨论。需要澄清的是,通过 std::vector::erase 擦除向量元素会使严格位于已擦除元素之后的迭代器无效。但是,位于已擦除元素的确切位置的迭代器的有效性仍然不确定。从逻辑上讲,人们可能会假设该迭代器...
    编程 发布于2024-11-09
  • Python 开发人员如何增强调试技术以获得更高效的代码?
    Python 开发人员如何增强调试技术以获得更高效的代码?
    Python 中增强的调试技术增强 Python 中的调试过程对于寻求优化代码的开发人员至关重要。以下是一些帮助您完成此任务的宝贵提示:利用 PDB 模块PDB(Python 调试器)模块提供了全面的调试环境。通过将 pdb.set_trace() 集成到代码中,您可以在特定位置建立断点。这个灵活的...
    编程 发布于2024-11-09
  • AdaBoost - 集成方法,分类:监督机器学习
    AdaBoost - 集成方法,分类:监督机器学习
    Boosting Definition and Purpose Boosting is an ensemble learning technique used in machine learning to improve the accuracy of models...
    编程 发布于2024-11-09
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-09
  • 重新学习CS基础知识——实现队列
    重新学习CS基础知识——实现队列
    你曾经站在队列中吗,队列数据结构也做同样的事情。当你想在你最喜欢的自助餐厅点餐时,你站在队伍的最后,然后你就可以继续排队并离开。 CS 中的队列数据结构执行相同的功能。队列数据结构是先进先出的数据结构。队列数据结构可以使用两个基本函数 Enqueue 和 Dequeue 来构建,这两个函数基本上是...
    编程 发布于2024-11-09
  • 为 Angular 18 设置 linter 和 IDE
    为 Angular 18 设置 linter 和 IDE
    将 eslint、prettier、env 添加到应用程序中。 遗憾的是,Angular 默认情况下不会自行生成这一切。更改原理图可以提高数千个 Angular 项目的质量。 设置 eslint 9 连接 eslint: yarn ng add @angular-eslint/sch...
    编程 发布于2024-11-09
  • 使用 JavaScript 进行网页抓取和代理设置的初学者指南
    使用 JavaScript 进行网页抓取和代理设置的初学者指南
    使用JavaScript代码模拟用户操作,获取所需信息。包括模拟用户打开网页、点击链接、输入关键字等操作,并从网页中提取所需信息。 Javascript网页抓取的核心原理 使用JavaScript代码模拟用户操作来获取所需信息。包括模拟用户打开网页、点击链接、输入关键字等操作,并从网...
    编程 发布于2024-11-09
  • 在 Android 上运行 Llama:使用 Ollama 的分步指南
    在 Android 上运行 Llama:使用 Ollama 的分步指南
    Llama 3.2 最近在 Meta 开发者大会上推出,展示了令人印象深刻的多模式功能以及针对使用高通和联发科技硬件的移动设备进行优化的版本。这一突破使开发人员能够在移动设备上运行 Llama 3.2 等强大的 AI 模型,为更高效、私密和响应迅速的 AI 应用程序铺平道路。 Meta 发布了 Ll...
    编程 发布于2024-11-09
  • 如何在 Python 中格式化字符串以将它们对齐直列?
    如何在 Python 中格式化字符串以将它们对齐直列?
    以固定宽度打印字符串打印字符串时,将它们对齐成直列可以增强可读性。在 Python 中使用 format 或 f-string 提供了实现此目的的便捷方法。使用 str.format()str.format() 提供了一种简单的填充方法字符串。其语法包括占位符 {},后跟格式化表达式。对于左对齐,请...
    编程 发布于2024-11-09
  • 为什么微服务比单体架构重要
    为什么微服务比单体架构重要
    在当今快节奏的技术环境中,企业需要可扩展且灵活的解决方案来快速适应不断变化的需求。与传统的整体方法相比,这就是微服务架构的亮点。 1.什么是单体架构? 单体架构是一个单一的、统一的系统,其中所有组件都是互连和相互依赖的。这意味着对系统的任何更改或更新都需要重新构建和重新部署整个应用程...
    编程 发布于2024-11-09
  • 如何在 PHP 中访问对象属性:了解语法和错误解决方案
    如何在 PHP 中访问对象属性:了解语法和错误解决方案
    理解 PHP 对象属性访问在 PHP 中,访问对象属性对于处理复杂的数据结构至关重要。属性保存与对象关联的信息,使我们能够管理和操作该数据。访问对象属性有两种常用语法:1。 $property1此语法直接通过名称访问特定属性。它用于分配或检索各个属性的值。但是,这种方法要求您提前知道确切的属性名称。...
    编程 发布于2024-11-09
  • PDO如何防止SQL注入并替换转义单引号?
    PDO如何防止SQL注入并替换转义单引号?
    PDO防止SQL注入的方法如果你已经从mysql库过渡到PDO,你可能想知道如何替换real_escape_string用于转义发往数据库的字符串中的单引号的函数。虽然向每个字符串添加斜杠可能看起来很麻烦,但 PDO 提供了一种更有效的替代方案。PDO 准备的强大功能为了防止 SQL 注入,PDO ...
    编程 发布于2024-11-09
  • 通过“项目:使用互斥体同步多线程打印”课程释放您的编码潜力
    通过“项目:使用互斥体同步多线程打印”课程释放您的编码潜力
    您准备好深入多线程编程的世界并学习如何使用互斥体来同步字符串的打印了吗? LabEx 提供的项目:使用互斥体同步多线程打印课程就是您的最佳选择。 在这个基于项目的综合课程中,您将踏上了解互斥体在协调多线程执行方面的重要性的旅程。您将首先修改现有的“混沌打字机”程序,确保字符串以正确的顺序打印,而不会...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3