<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[jimy1的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/jimy1</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; jimy1]]></copyright><item><title><![CDATA[跳板机访问云服务实例 与 SSH 转发]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/170201368</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/170201368</guid><author>jimy1</author><pubDate>Fri, 06 Nov 2026 23:11:14 +0800</pubDate><description><![CDATA[用华为云小带宽 VPS 做 SSH 跳板机是否够用？SSH 的转发能力有多强？]]></description><category></category></item><item><title><![CDATA[xvalue 的引入，对学习 C++ 难度的影响（二）]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/170054478</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/170054478</guid><author>jimy1</author><pubDate>Wed, 04 Nov 2026 23:37:24 +0800</pubDate><description><![CDATA[xvalue 是 C++ 移动语义的心智模型在类型系统中的体现，本质是“有身份且可移动”的表达式。它并非让 C++ 变难的主因，真正挑战来自模板、重载决议与生命周期管理。日常只需记住：具名变量是 lvalue，需 std::move 转为 xvalue 才能触发移动语义。关键陷阱包括 const 上 std::move 退化为拷贝、移动后对象状态不可用、以及引用绑定时生命周期延长规则——仅当引用直接绑定 prvalue 临时量或其子对象时才有效。xvalue 本身不延长生命周期，经函数返回或取成员后仍可能悬]]></description><category></category></item><item><title><![CDATA[xvalue 的引入，对学习 C++ 难度的影响（一）]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/170053898</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/170053898</guid><author>jimy1</author><pubDate>Wed, 04 Nov 2026 22:37:02 +0800</pubDate><description><![CDATA[C++11 引入 xvalue 与右值引用，使值类别增至三类（lvalue、xvalue、prvalue），支持移动语义与完美转发。虽概念复杂，但日常使用中标准库自动优化，无需频繁手动 std::move。真正难点在于编写类或泛型库时理解引用折叠、转发引用及移动语义细节。学习应循序渐进：先掌握直觉，再深入底层规则。]]></description><category></category></item><item><title><![CDATA[string s = “hello“； string t = std::move(s)； t是什么类型？]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/169855050</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/169855050</guid><author>jimy1</author><pubDate>Tue, 03 Nov 2026 02:35:08 +0800</pubDate><description><![CDATA[std::move(s) 的类型是 std::string&&，但变量 t 的类型仍是 std::string。std::move 仅将 s 转为 xvalue，真正移动发生在 t 的移动构造函数调用中。t 作为具名变量始终是 lvalue，其类型由声明决定，不可变。移动后 s 处于有效但未指定状态，不应依赖其值。]]></description><category></category></item><item><title><![CDATA[C++ 不完整类型]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/169853172</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/169853172</guid><author>jimy1</author><pubDate>Tue, 03 Nov 2026 02:20:33 +0800</pubDate><description><![CDATA[不完整类型指编译器未知大小与布局的类型，如前置声明类、未知边界数组等。仅能进行不依赖大小的操作：声明指针/引用、函数参数、取地址、丢弃glvalue。prvalue需创建对象，故要求完整类型；而glvalue仅标识对象身份，可接受不完整类型。唯一例外是decltype操作数。测试验证了各标准下行为一致，核心区别在于“仅认身份”（glvalue）与“需产出值”（prvalue）。]]></description><category></category></item><item><title><![CDATA[C++ 引用 “int& a；”，编译器会报错，需要初始化]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/169650830</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/169650830</guid><author>jimy1</author><pubDate>Sun, 01 Nov 2026 21:47:26 +0800</pubDate><description><![CDATA[int& a; 声明非法，因引用必须在声明时初始化且不可改绑。正确用法如 int& a = x;，绑定到左值对象。非 const 左值引用不能绑定临时量，但 const int& 或 int&& 可以。引用赋值操作作用于被引用对象本身，而非改变绑定。函数参数、类成员（需初始化列表）、extern 声明等场合虽看似无初始值，实则绑定发生在其他位置。核心：引用是对象别名，必须初始化且终身不变。]]></description><category></category></item><item><title><![CDATA[C++ 报错的 qualifiers 的意思]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/169648887</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/169648887</guid><author>jimy1</author><pubDate>Sat, 31 Oct 2026 15:27:14 +0800</pubDate><description><![CDATA[报错中的“qualifiers”指类型限定符，即 const 和 volatile。本例中，const Person& 传入的 p 是常量对象，调用非 const 成员函数 setName 会试图将 const Person* 转为 Person*，丢弃 const 限定符，故报错。解决方法是：若函数不修改对象，应加 const 修饰符；否则不可在 const 对象上调用。]]></description><category></category></item><item><title><![CDATA[C++ const 引用不能调用非 const 成员函数]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/169648316</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/169648316</guid><author>jimy1</author><pubDate>Sat, 31 Oct 2026 15:10:05 +0800</pubDate><description><![CDATA[编译错误源于 const Person& p 只能调用 const 成员函数，而 setName 非 const，其 this 指针类型不匹配。两个条件缺一不可：参数为 const 且函数非 const。正确做法是避免在只读函数中调用修改成员的函数，保持接口语义一致。mutable 仅允许在 const 函数中修改特定成员。]]></description><category></category></item><item><title><![CDATA[C++ 移动语义（Move Semantics）详解]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/169171338</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/169171338</guid><author>jimy1</author><pubDate>Tue, 27 Oct 2026 00:21:45 +0800</pubDate><description><![CDATA[移动语义是C++11引入的核心特性，通过右值引用（&&）实现资源的转移而非复制，显著提升性能。它允许将临时对象或即将销毁的资源“偷走”，避免不必要的深拷贝。关键概念包括移动构造函数、移动赋值运算符和std::move（仅做类型转换）。为确保标准库使用移动而非拷贝，移动操作需标记noexcept。推荐遵循“零法则”，优先使用std::vector等自带资源管理的类型，让编译器自动生成高效移动操作。掌握移动语义是编写高性能现代C++代码的关键。]]></description><category></category></item><item><title><![CDATA[c语言和c++里面的左值、右值]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/169070698</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/169070698</guid><author>jimy1</author><pubDate>Mon, 26 Oct 2026 22:43:20 +0800</pubDate><description><![CDATA[C 语言仅有左值概念，指有地址的可寻址对象；而右值仅作为非左值的通俗说法，无正式定义。C++ 在此基础上构建了完整的左值/右值体系，引入纯右值（prvalue）、将亡值（xvalue）和右值引用（&&），核心目的为支持移动语义与资源高效转移，提升性能。因此，“右值体系”是 C++ 为优化对象生命周期管理而扩展的关键机制。]]></description><category></category></item><item><title><![CDATA[构造函数表达式的值类别是：prvalue]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/169062432</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/169062432</guid><author>jimy1</author><pubDate>Sun, 25 Oct 2026 14:05:28 +0800</pubDate><description><![CDATA[C++ 中构造表达式 T() 的结果为 prvalue，因其本质是“对象的初始化配方”而非已有对象。这一设计使编译器能强制执行复制消除（C++17起），直接在目标位置构造对象，实现零开销优化。即使类型不可拷贝或不可移动，也能合法初始化。同时，prvalue绑定引用时物化为xvalue，延长生命周期。该机制清晰区分初始化、移动与持久对象，是返回值优化和高效资源管理的语言基础。]]></description><category></category></item><item><title><![CDATA[C++ 中的 `T&&`：右值引用与转发引用]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/168985555</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/168985555</guid><author>jimy1</author><pubDate>Sun, 25 Oct 2026 02:48:48 +0800</pubDate><description><![CDATA[C++ 中 T&& 分为右值引用与转发引用：当 T 为确定类型时，T&& 是右值引用，用于移动语义；当 T 参与模板推导且形式为 T&& 时，为转发引用（万能引用），可完美转发左值或右值。关键在于 T 是否在模板参数中被推导。引用折叠规则决定最终类型：只要有一个 &，结果就是 &。std::move 无条件转右值，std::forward 保留原始值类别，实现完美转发。注意：有名字的右值引用表达式是左值。]]></description><category></category></item><item><title><![CDATA[C++ 中 xvalue 的 identity 存在哪里？和 lvalue 的 identity 有什么区别？]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/168979204</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/168979204</guid><author>jimy1</author><pubDate>Sat, 24 Oct 2026 23:46:48 +0800</pubDate><description><![CDATA[identity 是表达式指代确定对象的属性，不占单独内存，lvalue 与 xvalue 均为 glvalue，本质区别在于对对象资源的使用方式：lvalue 表示继续使用，xvalue 表示资源可重用（可能触发移动）。std::move(s) 不改变对象地址或身份，仅改变表达式值类别；移动的是资源状态而非对象本身，且移动后原对象仍有效但未指定。&std::move(s) 不合法，因取地址要求 lvalue。]]></description><category></category></item><item><title><![CDATA[C++ 中 构造函数 Test() 和 Test{} 是 xvalue 还是 prvalue？]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/168979060</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/168979060</guid><author>jimy1</author><pubDate>Sat, 24 Oct 2026 23:31:42 +0800</pubDate><description><![CDATA[Test() 和 Test{} 均为 prvalue（纯右值），非 xvalue。它们是创建对象的表达式，类型为 Test，值类别由 decltype((expr)) 验证：prvalue 对应 T，lvalue 对应 T&，xvalue 对应 T&&。C++17 中，临时对象实质化会将 prvalue 转为 xvalue 以绑定引用，但原表达式仍为 prvalue。构造函数本身非表达式，不参与值类别划分。]]></description><category></category></item><item><title><![CDATA[lvalue、xvalue、prvalue（二）：引用是哪一类？]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/168884661</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/168884661</guid><author>jimy1</author><pubDate>Fri, 23 Oct 2026 23:58:04 +0800</pubDate><description><![CDATA[C++中引用类型（如T&、T&&）与表达式的值类别（lvalue、prvalue、xvalue）并非同一概念。右值引用变量本身是lvalue，如Test&& r = Test{}中r为lvalue；Test{}是prvalue，std::move(r)是xvalue。xvalue表示“即将消亡的值”，但不等于立即析构或已移动。正确判断需用decltype((expr))：得T&为lvalue，T&&为xvalue，非引用为prvalue。原文混淆了类型与值类别，错误认为“引用即xvalue”或“右值引用参数]]></description><category></category></item><item><title><![CDATA[lvalue、xvalue、prvalue（一）：三者的分类]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/168884631</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/168884631</guid><author>jimy1</author><pubDate>Fri, 23 Oct 2026 23:20:12 +0800</pubDate><description><![CDATA[表达式分类的核心是三元划分：lvalue（左值）、xvalue（将亡值）、prvalue（纯右值）。glvalue（广义左值）= lvalue ∪ xvalue，rvalue = xvalue ∪ prvalue。xvalue 是两者的交集——既有 identity（可取地址），又可被移动。标准从“有无 identity”与“能否被移动”两个维度定义三类：有 identity 且可移动为 xvalue，有 identity 且不可移动为 lvalue，无 identity 为 prvalue。因此，真正互斥]]></description><category></category></item><item><title><![CDATA[引用的步长，是否有步长信息]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/168874692</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/168874692</guid><author>jimy1</author><pubDate>Fri, 23 Oct 2026 15:22:52 +0800</pubDate><description><![CDATA[本文澄清了C++中指针与引用的步长机制：指针仅存储地址，步长由静态类型在编译期决定，而非指针自身携带。p + 1与q + 1步长不同源于类型差异（int vs int[3]），而引用是对象别名，无“前进”操作，其运算作用于所引对象。标准不强制引用占用存储，且基类转换的偏移与元素步长属不同概念。原文核心观点正确，仅需补充“通常无额外步长字段”等限定，整体严谨。]]></description><category></category></item><item><title><![CDATA[单继承和多重继承的异同：基类成员的常量偏移]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/168764260</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/168764260</guid><author>jimy1</author><pubDate>Thu, 22 Oct 2026 14:31:14 +0800</pubDate><description><![CDATA[该代码中，rb、p、q 并不依赖“步长”访问成员。指针算术中的“步长”仅用于数组遍历，而此处仅为引用绑定与类型转换。成员访问基于静态类型确定的编译期常量偏移（如 a 在偏移0，b 在4，c 在8），运行时直接“基址+常数”访问，无乘法或步长参与。多重继承下地址调整为常量偏移，非步长。三者本质区别在于静态类型决定可见成员及偏移，而非访问方式。]]></description><category></category></item><item><title><![CDATA[c++类成员访问只看静态类型]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/168453904</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/168453904</guid><author>jimy1</author><pubDate>Mon, 19 Oct 2026 21:48:35 +0800</pubDate><description><![CDATA[pb 的静态类型为 Base*，成员访问仅依赖静态类型，故 pb->d 编译错误。pb->b 可访问，因 Base 声明了 b，且与 dv.b 共享同一内存。通过 static_cast<Derived*>(pb)->d 可访问 d，前提是 pb 确实指向 Derived 对象。虚函数可实现动态分派，但数据成员无此机制，无法“虚访问”。若对象非 Derived，强转后访问 d 会导致未定义行为（UB）。]]></description><category></category></item><item><title><![CDATA[无虚函数基类指针指向派生类对象，为什么能访问派生类成员变量？有虚函数的异同]]></title><link>https://blog.youkuaiyun.com/jimy1/article/details/168444286</link><guid>https://blog.youkuaiyun.com/jimy1/article/details/168444286</guid><author>jimy1</author><pubDate>Mon, 19 Oct 2026 21:46:10 +0800</pubDate><description><![CDATA[基类指针只能访问基类声明的成员变量，即使其指向派生类对象。成员变量访问由指针的静态类型决定，与对象动态类型无关。虚函数仅影响函数调用的动态绑定，不改变成员变量访问权限。若需访问派生类新增成员，必须通过 static_cast 或安全的 dynamic_cast（要求基类有虚函数）进行显式转换，否则会导致未定义行为。]]></description><category></category></item></channel></rss>