[C++] 深入了解左值与右值
C:左值与右值 最初,C 语言中的左值(lvalue)意味着任何可以赋值的东西,因为它们可以放在赋值等号的左边,因此它们被命名为左值;相反地,那些只能放在赋值等号右边的东西就被称为右值(rvalue)。 时过境迁,随着 C 语言的版本迭代,这种分类方法已经不再具有价值,左值和右值的定义也随之发生改变。 但是在开始之前,我们需要特别明确一个概念:左值和右值在 C/C++ 中是表达式(ex...
C:左值与右值 最初,C 语言中的左值(lvalue)意味着任何可以赋值的东西,因为它们可以放在赋值等号的左边,因此它们被命名为左值;相反地,那些只能放在赋值等号右边的东西就被称为右值(rvalue)。 时过境迁,随着 C 语言的版本迭代,这种分类方法已经不再具有价值,左值和右值的定义也随之发生改变。 但是在开始之前,我们需要特别明确一个概念:左值和右值在 C/C++ 中是表达式(ex...
使用工具: Bus Hound, USB Device Tree Viewer 打开 Bus Hound,转到 Devices 选项卡,在设备列表中找到想抓包的 UVC 设备,勾选其 UVC interface。如果你不确定,可以把全部勾上,不影响: 通常,Video 帧数据通过 ISOC 传输,为了避免巨量的帧数据影响我们抓包,我们可以在 Settings 选项卡里把 ISOC 取...
在 C++20 中,我们有 Coroutine,在 Rust 中,我们有 Async。严格来说,二者之间没有完全等效的概念,但是我们可以找到一些相似之处,进而了解 C++ Coroutine 与 Rust Async 设计上的异同点。 由于我的上一篇文章介绍了 C++ 的 Coroutine,因此我们本文主要以 C++ Coroutine 的视角来看 Rust 的 Async。 为了更好...
前言 近段时间研究了一下 C++20 的协程(Coroutine),大概了解了其中的工作原理,做一下记录。 初次接触 Coroutine 时,给我的感觉是一脸懵逼的。和其他语言简单的 async、await 不同,想要使用 C++20 的 Coroutine,它要求你定义一个包含 promise_type 的类型,其中 promise_type 又需要至少包含 get_return_ob...
我们都知道,C++ 是不允许 lambda 函数递归调用自己的,如果想要递归,最好的办法就是使用 std::function: #include <functional> #include <iostream> int main() { std::function<unsigned(unsigned)> fact = [&fact](uns...
前言 本文并不是移动语义的教程,并且本文假设你已经看过 the Book,已经了解了 Rust 中所有权的概念。 本文包含汇编和 MIR,但是并非需要了解汇编和 MIR 才能看懂。只要跟随本文的思路,即使以前不懂汇编和 MIR,也可以理解本文所表达的意图。 从汇编看移动 先简简单单 wrapper 一个 i32: use std::fmt::Debug; #[derive(Deb...
什么是中文编程 中文编程(或者称为中文编程语言)是指使用中文来书写的程序设计语言,其目的是为了减少对英语的学习,将精力集中在程序设计上,并且便于程序交流和代码维护。 摘自百度百科。 我认为中文编程可以从浅入深地划分为三种类型: 使用中文标识符 使用中文关键字 使用中文语法 使用中文标识符 这种中文编程是入门门槛最低的:绝大部分现代语言的编译器都支持 Uni...
前段时间,我想要通过提供选项框的形式来允许用户自定义界面 UI 的字体和大小,就像这样: 然后生成形如 * { ... } 的 QSS 字符串,通过 qApp->setStyleSheet(qss) 应用给所有窗口组件。 然而奇怪的事情出现了,我在主界面有两个 QTextBrowser 组件,一个是通过 new QTextBrowser 出来然后 addWidget 到布局上的...
概览 在整个 2022 年,Rust 一共发布了 1.58.0 ~ 1.66.0 共 9 个版本,让我们感谢 Rust 团队一整年的付出。 通常来说,大部分人都不是喜欢追着 Release Note 啃的类型,因此对于大部分人而言,Rust 的语法就只有书上写出来的那一些。这也是我撰写这篇文章的目的:总结和记录 Rust 整个 2022 年稳定的语法,让更多人意识到 “原来 Rust 还...
测试环境 OS: Ubuntu 22.04 CC: GCC 11.2.0 重载决议 重载决议(Overload Resolution)的定义,摘自 cppreference: 为了编译函数调用,编译器必须首先进行名字查找,对于函数可能涉及实参依赖查找,而对于函数模板可能后随模板实参推导。如果这些步骤产生了多个候选函数,那么需要进行重载决议选择将要实际调用的函数。 ...