Tag: C#
C++ 左值(lvalue)、右值(rvalue)与右值引用(rvalue reference) 理解 C++ 中的左值、右值及其引用形式,是掌握现代 C++(尤其是 C++11 以后的移动语义/move和完美转发/perfect forwarding)必不可少的基础。 📌 什么是左值(lvalue) 左值指的是有名字、可寻址的对象,通常可以出现在赋值语句的左侧。 int x = 10; x = 20; // x 是左值 int* p = &x; // 可以取地址 …
C++ assert 与 static_assert 的区别 C++ 提供了两种机制来验证程序中的假设(断言):assert 和 static_assert。虽然它们看起来类似,但它们在不同的阶段工作,并且用途也不同。 🔍 assert — 运行时检查/断言 assert 用于在程序运行时验证条件是否成立。如果条件为假,程序会打印错误信息并中止运行。 #include <cassert> int divide(int x, int y) { assert(y != 0); // 如果 y …
为什么 auto_ptr 在 C++ 中被弃用 TLDR; 很久之前看到auto_ptr就觉得挺好,和auto一样,反正不用自己管,C++会自动推导智能指针的类型。不过这个关键字已经在C++ 11中被弃用/deprecated。 弃用与移除 std::auto_ptr 在 C++ 11 中被弃用。 在 C++ 17 中被完全移除。 为什么 auto_ptr 被弃用? 它具有不安全的拷贝语义/copy semantics。 拷贝一个 auto_ptr 会转移所有权,并将原指针设为 nullptr。 这种行为很容易引发 bug,尤其是在标准容器或算法中使用时。 …
C++:什么是 consteval?它与 const 和 constexpr 有何不同? 如果你在 C++ 中经常使用 const 和 constexpr,可能会好奇 C++20 新引入的 consteval 关键字到底是做什么用的。下面我们来一一解析。 什么是 consteval? consteval 用于声明一个立即函数(immediate function),也就是说,这个函数必须在编译期进行求值。与 constexpr 不同,constexpr 允许函数在编译期或运行期执行,而 consteval 强制要求只能在编译期调用。 consteval int square(int …
📘 C++ 移动语义与 std::move() 教程 C++的std::move用于转移变量/对像的所有权/Ownership。 🔹 什么是移动语义? 在 C++ 中,移动语义通过转移资源所有权/Ownership(如内存或文件句柄)来优化性能,而不是复制它们。 移动语义是在 C++11 中引入的,它允许: 更快速地传递大型或昂贵的对象 更高效地使用临时值 🔹 什么是 std::move()? std::move(x) 并不会真的移动任何东西 —— 它只是将 x 转换为一个 右值引用(即 T&&),告诉编译器: “你可以把这个对象当作临时对象来处理并移动它。” 要真正实现移动,你的类型必须实现 …
C++ const 与 constexpr:真正的区别是什么? 一眼看都是定义常量。 为什么这很重要 现代 C++ 鼓励编写不可变、高效且表达力强的代码。两个关键字—const 和 constexpr—是这一理念的核心。它们看起来很相似,但理解它们的不同语义,对于正确利用编译期与运行期行为至关重要。 高层次对比 特性 const constexpr 编译期常量? 可能 一定(否则编译报错) 支持运行期? 支持 支持(在需要时运行期求值) 用于数组/模板参数? 仅当确实是常量 保证可用 允许函数? 仅限成员函数限定符 支持完整函数且可在编译期求值 1 声明不可变数据 const:构造后不可变 …
C++20 引入了 ranges(范围),这是一个强大且优雅的抽象,用于处理序列(如数组、vector 等)。相比传统的迭代器或旧式循环,Ranges 提高了代码的可读性、可组合性和性能。 什么是 Range? 在 C++20 中,range(范围) 是一种抽象,代表一个可以迭代的元素序列。它与 views(视图) 和 actions(操作) 如过滤、转换等配合使用非常自然。 传统循环 vs 基于 Range 的循环 #include <iostream> #include <vector> int main() { std::vector<int> v …