C++ const关键字深度解析:从基础语义到高级应用实战
1. 项目概述为什么const是C的基石如果你写过C肯定见过const。它可能是你最早接触的关键字之一但也是最容易被轻视和误解的一个。很多人觉得const不就是定义一个常量吗有什么好讲的但在我十多年的C开发生涯里因为const用错或者没用对而引发的bug从内存泄漏到逻辑错误数不胜数。它远不止是“常量”那么简单而是C表达意图、保证安全、优化性能的核心工具。简单来说const是一个类型限定符它告诉编译器更重要的是告诉读代码的人这个对象或数据在初始化后其值不应该被改变。这听起来简单但当它和指针、引用、函数参数、成员函数、返回值等组合在一起时位置不同含义天差地别。理解这些细微差别是写出健壮、高效、易于维护的C代码的关键一步。无论是应对面试中的“八股文”还是在实际项目中设计稳定的接口const的正确使用都是区分初级程序员和资深工程师的一道分水岭。2.const的基础语义与核心价值在深入各种复杂用法之前我们必须夯实基础。const最根本的含义是“不变性”或“只读性”。一旦一个对象被const修饰任何试图修改其值的操作都会在编译阶段被编译器捕获并报错。这为程序增加了一层编译期的保护。2.1const的基本用法与编译期检查定义一个基本类型的常量非常简单const int MAX_BUFFER_SIZE 1024; // 定义一个整型常量 MAX_BUFFER_SIZE 2048; // 错误编译失败不能修改 const 对象这里MAX_BUFFER_SIZE在定义时被初始化为1024之后任何对其赋值的企图都会导致编译错误。编译器在这里扮演了“守门员”的角色。这种不变性带来的好处是显而易见的意图清晰任何阅读代码的人一眼就能看出MAX_BUFFER_SIZE是一个不应该被改变的配置值或魔法数字。避免意外修改在复杂的函数调用链或多人协作中可以防止某个函数无意中修改了本不该修改的全局或传入参数。编译器优化编译器知道const对象的值不会改变可以进行更激进的优化比如将常量直接替换到使用它的地方常量传播甚至在某些情况下将其放入只读内存段。注意const对象必须在定义时初始化。因为一旦定义就无法再赋值所以编译器必须确保它在诞生时就有确定的值。对于类类型的const成员变量初始化必须在构造函数的成员初始化列表中进行而不能在构造函数体内赋值。2.2const与宏定义#define的对比很多从C语言转过来的开发者喜欢用#define来定义常量。但在C中const是更优的选择。#define PI 3.14159 // C风格宏定义 const double Pi 3.14159; // C风格常量它们之间的核心区别在于作用域与类型安全#define是简单的文本替换没有作用域概念在预处理阶段就被替换容易产生命名冲突和意料之外的替换。而const变量有明确的作用域全局、命名空间、局部和数据类型编译器会进行严格的类型检查。调试支持#define定义的符号在编译后的二进制中不存在调试器无法看到PI这个符号你只能看到被替换后的数字3.14159。而const变量是一个真正的变量尽管不可修改在调试时你可以观察它的名字和值。更复杂的常量const可以定义数组、结构体等复杂类型的常量而#define在这方面非常笨拙。实操心得在现代C项目中应完全摒弃使用#define来定义常量统一使用const或C11引入的constexpr用于编译期常量。这能让代码更安全、更易维护、更利于调试。3.const与指针的组合顶层与底层const这是const理解中最容易混淆也是面试中最常被问到的部分。当const遇到指针*它的位置决定了它修饰的是谁。3.1 四种组合形式及其含义一个指针涉及两个对象指针变量本身存储地址和它所指向的对象。const可以修饰其中任何一个或两者。指向常量的指针常量指针底层constconst int* p; // 或 int const* p;const在*左边修饰的是int。这意味着指针p可以指向不同的整数但不能通过p来修改它所指向的那个整数的值。指针本身是可变的指向的数据是只读的。int a 10, b 20; const int* p a; // *p 30; // 错误不能通过 p 修改 a 的值 p b; // 正确p 本身可以改变现在指向 b // *p 30; // 依然错误不能通过 p 修改 b指针常量顶层constint* const p a;const在*右边修饰的是指针变量p。这意味着指针p一旦初始化指向某个地址就不能再指向别处但可以通过p修改它所指向地址的值。指针本身是只读的指向的数据是可变的。int a 10, b 20; int* const p a; *p 30; // 正确可以通过 p 修改 a 的值现在 a 30 // p b; // 错误p 本身不能再指向其他地址指向常量的指针常量两者皆constconst int* const p a;这是上面两种情况的结合。const既在*左边也在*右边。这意味着指针p不能改变指向也不能通过p修改它所指向的值。两者都是只读的。int a 10; const int* const p a; // *p 20; // 错误 // p some_other_var; // 错误普通指针int* p;作为对照普通指针既可以改变指向也可以改变指向的值。记忆技巧沿着*号画一条分割线。const在*左边表示修饰的是指向的数据类型底层const数据不变const在*右边表示修饰的是指针变量本身顶层const指针不变。int const*和const int*是完全等价的但通常使用const int*更符合阅读习惯“指向const int的指针”。3.2 顶层const与底层const的赋值兼容性理解它们之间的赋值规则至关重要这关系到函数传参、返回值接收等日常操作。顶层const不影响赋值拷贝一个对象时顶层const指针本身是常量会被忽略。因为拷贝操作拷贝的是值新对象是否常量与旧对象无关。int i 0; int* const p1 i; // 顶层const int* p2 p1; // 正确忽略 p1 的顶层constp2 是一个非常量指针但指向 i底层const必须一致拷入和拷出的对象必须具有相同的底层const资格或者可以将非常量转换为常量反之则不行。这非常符合直觉你不能让一个“指向非常量”的指针指向一个“常量”对象因为这样就有了通过该指针修改常量的风险。const int ci 42; const int* p1 ci; // 正确底层const一致 int* p2 ci; // 错误不能用 int* 指向 const int int* p3 p1; // 错误同上p1有底层constp3没有 int i 10; const int* p4 i; // 正确可以将 int* 转换为 const int*增加底层const // *p4 20; // 错误不能通过 p4 修改 i i 20; // 正确i 本身是非常量可以直接修改实操心得在函数参数中如果函数不需要修改指针所指向的内容应尽量使用指向常量的指针const T*或指向常量的引用const T。这极大地提高了函数的通用性它既可以接受常量对象作为参数也可以接受非常量对象作为参数通过添加底层const转换同时向调用者明确承诺“我不会修改你传进来的数据”。4.const与引用别名与只读保证引用本质上是对象的别名。当引用与const结合时我们得到“常量引用”。4.1 常量引用的定义与特性int a 10; const int ref a; // ref 是 a 的常量引用const int ref表示ref是一个引用它绑定到a但通过ref只能读取a的值不能修改。注意a本身可能并不是常量如上例只是ref这个“视角”把它当作常量看待。常量引用有以下几个关键特性可以绑定到右值这是常量引用一个极其重要的特性。非常量引用int只能绑定到左值有明确内存地址的对象而常量引用可以绑定到左值和右值如临时对象、字面量。int r1 10; // 错误10是右值 const int r2 10; // 正确常量引用可以绑定到右值 const int r3 a 5; // 正确a5的结果是临时对象右值这为函数接受临时对象作为参数提供了可能是函数参数传递中非常常用的技术。延长临时对象生命周期当一个常量引用绑定到一个临时对象右值时该临时对象的生命周期会被延长到与引用的生命周期相同。这避免了悬垂引用。const std::string getString() { return Hello World; // 返回一个临时字符串的常量引用生命周期被延长 }4.2 常量引用作为函数参数这是C中传递非内置类型参数如类对象的首选方式特别是当函数不需要修改参数时。void printValue(const std::string str) { std::cout str std::endl; // str[0] A; // 错误不能通过常量引用修改 } std::string s1 Hello; const std::string s2 World; printValue(s1); // 正确传递非常量对象 printValue(s2); // 正确传递常量对象 printValue(Temp); // 正确传递临时对象右值使用常量引用作为参数的优势效率避免了按值传递时不必要的对象拷贝尤其是大对象。通用性既可以接受常量对象也可以接受非常量对象和临时对象。明确性在函数签名中就声明了“我不会修改这个参数”是接口设计的一部分。注意事项对于内置类型如int,double由于拷贝成本极低有时按值传递更简单直接。但对于任何用户自定义类型或标准库容器std::vector,std::string等除非你需要函数内部修改原始对象此时用非常量引用T否则应优先使用const T。5.const在函数中的应用const不仅可以修饰数据和引用还能修饰函数本身和函数的返回值这是C实现“常量正确性”的关键。5.1 常量成员函数在类成员函数的声明和定义末尾加上const关键字表示这个函数不会修改该类的成员变量除了被mutable修饰的变量。class MyClass { public: int getValue() const { // 常量成员函数 // m_data 10; // 错误不能在常量成员函数中修改成员变量 return m_data; } void setValue(int v) { // 非常量成员函数 m_data v; } private: int m_data; };规则与影响常量对象只能调用常量成员函数这是最重要的规则。一个被声明为const MyClass obj;的对象只能调用其类中声明为const的成员函数。这保证了常量对象的逻辑状态不被改变。const MyClass constObj; int x constObj.getValue(); // 正确getValue 是 const 的 // constObj.setValue(5); // 错误setValue 不是 const 的重载依据const可以作为成员函数重载的依据。即可以同时存在int getValue() const;和int getValue();两个版本。常量对象调用前者非常量对象优先调用后者如果存在。mutable成员如果一个成员变量被mutable关键字修饰那么即使在常量成员函数中也可以修改它。这通常用于一些与对象逻辑状态无关的“缓存”或“调试计数”。class Cache { private: mutable bool m_cacheValid{false}; mutable int m_cachedValue; int expensiveCalculation() const; public: int getValue() const { if (!m_cacheValid) { m_cachedValue expensiveCalculation(); // 正确mutable成员可以修改 m_cacheValid true; // 正确 } return m_cachedValue; } };实操心得在设计类时应养成习惯将所有不修改对象状态的成员函数都声明为const。这不仅是良好的设计规范也使得你的类更容易被安全地使用例如在常量上下文或线程安全考虑中。如果你后来发现某个const函数需要修改成员那应该重新审视设计而不是轻易去掉const或滥用mutable。5.2 返回值为const函数可以返回const值、const引用或const指针。const int getConstant(); // 返回 const int const std::string getConstRef(); // 返回常量引用 const int* getConstPointer(); // 返回指向常量的指针返回const值对于内置类型返回const值意义不大因为返回值本身是右值本来就无法被赋值getConstant() 5;本身就是错误的。但对于类类型返回const值可以防止对返回的临时对象调用非常量成员函数或者防止将其用作非常量引用的初始化虽然这有时会妨碍移动语义在现代C中需谨慎使用。返回const引用/指针这非常重要。它通常用于返回类内部数据的只读视图调用者可以通过这个引用/指针读取数据但不能修改。这既提供了访问效率避免拷贝又保证了封装性。class MyContainer { std::vectorint m_data; public: const std::vectorint getData() const { return m_data; } // 返回常量引用外部可以读取但不能修改 m_data };警告绝对不要返回局部变量的引用或指针无论是否const这会导致悬垂引用/指针是未定义行为。6.const在实战中的高级应用与技巧理解了基本语法后我们来看看const在更复杂场景下的应用和它带来的一些微妙问题。6.1const_cast与类型转换const_cast是C中唯一能够移除或添加const或volatile属性的运算符。但它是一把极其危险的双刃剑。const int ci 10; // int* pi ci; // 错误 int* pi const_castint*(ci); // 强制移除 const *pi 20; // 未定义行为ci 本身是常量存储在只读内存段可能 std::cout ci , *pi std::endl; // 输出可能是 10, 20行为不确定为什么危险如果原始对象本身就是一个常量对象如上例的ci通过const_cast移除const并修改它会导致未定义行为。程序可能崩溃也可能产生奇怪的结果。安全的使用场景const_cast主要用于这样一种情况你有一个指向非常量对象的常量指针/引用但你需要调用一个历史遗留的、参数类型不正确的非constAPI。void legacyAPI(char* str) { /* 会修改 str */ } void myFunc(const char* input) { // 我们知道 legacyAPI 不会修改 input 指向的字符串或者我们愿意承担风险 // 但它的签名不是 const char*。我们可以用 const_cast。 legacyAPI(const_castchar*(input)); // 谨慎使用 }核心原则只有在你能百分之百确定被const_cast处理掉的const属性并非对象本身固有即对象本身是非常量只是通过常量指针/引用访问它时才能使用const_cast。在99%的日常代码中你应该避免使用它。如果发现需要频繁使用const_cast往往是你的接口设计出了问题。6.2const与线程安全const是线程安全的重要辅助工具。一个声明为const的成员函数向使用者承诺它不会修改对象的可见状态。如果类的所有成员函数都是const的那么这个类的对象从逻辑上看就是不可变的可以被多个线程安全地读取无需额外的同步机制前提是没有mutable成员或者mutable成员本身是线程安全的。然而const并不等同于线程安全。一个常见的陷阱是“内部同步”问题。class ThreadUnsafeCache { mutable std::vectorint m_cache; // mutable以便在const函数中更新 public: int getValue(int key) const { // 假设这里需要计算并缓存 if (!cacheHit(key)) { // 问题多个线程可能同时执行到这里导致对 m_cache 的竞争写入 m_cache.push_back(calculate(key)); } return fetchFromCache(key); } };即使getValue是const的它内部通过mutable修改了成员。如果多个线程同时调用这个const函数就会发生数据竞争。因此对于mutable成员如果它可能在多线程环境下被访问必须提供适当的同步如使用std::mutex。class ThreadSafeCache { mutable std::mutex m_mtx; mutable std::vectorint m_cache; public: int getValue(int key) const { std::lock_guardstd::mutex lock(m_mtx); // 加锁保证线程安全 if (!cacheHit(key)) { m_cache.push_back(calculate(key)); } return fetchFromCache(key); } };6.3const在模板与泛型编程中的应用在编写模板函数或类时const的正确处理能让你的模板更加通用和健壮。templatetypename T void print(const T value) { // 使用常量引用接受任何类型 std::cout value std::endl; }对于返回类型推导const和引用需要特别小心templatetypename Container const auto getFirstElement(const Container cont) { // 返回常量引用保证不修改容器元素 return cont.front(); }在C11/14/17中auto的类型推导规则与模板参数推导类似。const auto会推导出常量引用类型确保返回的是只读视图。7. 常见问题与排查技巧实录在实际开发中关于const的错误和疑惑层出不穷。这里记录了一些典型场景和解决方法。7.1 编译错误排查表错误信息示例可能原因解决方案error: assignment of read-only location试图修改一个const对象。检查变量声明确认其是否为const。如果是函数参数检查函数签名是否应为const T但你用了T。error: passing ‘const X’ as ‘this’ argument discards qualifiers在一个常量对象上调用了一个非常量成员函数。将调用的成员函数声明为const或者如果你确定需要修改对象则不要将对象声明为const。error: invalid conversion from ‘const T*’ to ‘T*’试图将指向常量的指针赋值给普通指针丢失底层const。确认你的意图。如果确实不需要修改数据将目标指针类型改为const T*。如果确定数据可修改且安全考虑使用const_cast需极度谨慎。error: binding reference of type ‘T’ to ‘const T’ discards qualifiers试图用一个非常量引用绑定到一个常量对象或临时对象。将引用类型改为const T或者确保你绑定的是一个左值非常量对象。error: no matching function for call to ‘foo(...)’函数重载时传递常量对象但只有非常量版本函数。为类提供常量成员函数版本的重载。7.2const相关的典型“坑”const与#define的链接性在头文件中const全局变量默认具有内部链接在C中非extern的const全局变量作用域限于本编译单元。这意味着每个包含该头文件的.cpp文件都会有自己的副本。这通常不是问题但如果你需要的是一个在整个程序中唯一的常量需要在头文件中用extern声明在某个.cpp文件中定义。// config.h extern const int GLOBAL_CONFIG_VALUE; // 声明 // config.cpp const int GLOBAL_CONFIG_VALUE 100; // 定义const指针与typedef/using使用别名时要格外小心const的位置。typedef char* CString; const CString cstr; // 这是什么很多人会误以为这是const char*指向常量的指针。但实际上CString是一个指向char的指针类型。const CString等价于char* const是一个常量指针而不是指向常量的指针。正确的指向常量的指针别名应该是typedef const char* ConstCString;。使用using语法时同样需要注意。成员函数const重载的调用选择当一个非常量对象调用一个重载的、既有常量版本又有非常量版本的成员函数时编译器会优先选择非常量版本。这符合“最小权限原则”因为非常量版本可能提供更多的功能比如修改对象。但如果你需要一个常量版本的语义就需要将对象转为常量引用或指针来调用。class Text { public: char operator[](std::size_t pos) { /* 可修改版本 */ } const char operator[](std::size_t pos) const { /* 只读版本 */ } }; Text t; const Text ct; t[0] A; // 调用非常量版本 char c ct[0]; // 调用常量版本 char c2 static_castconst Text(t)[0]; // 强制调用常量版本掌握const的各种位置和含义是写出高质量C代码的必经之路。它不仅仅是一个关键字更是一种编程哲学——通过编译器的强制检查来表达设计意图约束行为从而减少错误提升代码的清晰度和可靠性。从今天开始有意识地在你的代码中运用const让它成为你编程习惯的一部分。

相关新闻

没用AI写为什么还被判AIGC?讲清检测逻辑再降下来

没用AI写为什么还被判AIGC?讲清检测逻辑再降下来

没用AI写为什么还被判AIGC?讲清检测逻辑再降下来 我猜你现在心里是有点憋屈的。这篇论文你是真的自己写的,一句一句敲出来的,改了七八遍,连参考文献都是自己一篇篇翻的。结果检测报告出来,AIGC 率标红一大片&#xff…

2026/10/17 18:14:47 阅读更多 →
OpenClaw2026安装部署全指南:跨平台AI助手环境配置详解

OpenClaw2026安装部署全指南:跨平台AI助手环境配置详解

最近在尝试部署AI助手工具时,发现OpenClaw2026作为新一代开源AI平台备受关注,但很多开发者在安装部署环节遇到了各种环境配置问题。本文基于官方文档和实际部署经验,整理一套完整的OpenClaw2026安装部署指南,涵盖Windows、macOS和…

2026/10/18 9:15:14 阅读更多 →
2026 线上快消品行业分析报告服务商实力榜单:魔镜洞察领衔,全域消费数据洞察平台选购指南

2026 线上快消品行业分析报告服务商实力榜单:魔镜洞察领衔,全域消费数据洞察平台选购指南

摘要线上快消赛道持续扩容,新品迭代、品牌出海、竞品监测、消费者需求挖掘成为企业经营核心刚需,专业线上市场调研与消费者洞察服务商成为品牌创新、市场决策的重要支撑。2026 年国内消费数据服务赛道分化明显,不同服务商在数据源覆盖、产品功…

2026/10/18 9:15:52 阅读更多 →

最新新闻

DeepThink V1.1.0 开源发布:用 TaoToken 统一 Key 打造个人 AI 操作系统,全自主托管跑通超复杂长程任务

DeepThink V1.1.0 开源发布:用 TaoToken 统一 Key 打造个人 AI 操作系统,全自主托管跑通超复杂长程任务

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:28:02 阅读更多 →
优秀的大模型API网关系统Veloera:Docker部署与TaoToken统一Key接入实践

优秀的大模型API网关系统Veloera:Docker部署与TaoToken统一Key接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:28:02 阅读更多 →
Java批量重命名命令行工具:正则匹配与安全校验实战

Java批量重命名命令行工具:正则匹配与安全校验实战

简介:针对Java文件批量重命名的源码包,面向日常开发中需要整理大量文件的Java程序员,提供一套简单直接的解决方案;整个资源为一个压缩包,体积仅1KB,内含1个Java源文件,代码结构紧凑,…

2026/10/19 0:28:02 阅读更多 →
Java 重造 Agent 框架:从 ReAct 到工具调用的工程实践

Java 重造 Agent 框架:从 ReAct 到工具调用的工程实践

1. 为什么我要用 Java 重造一个 Agent 框架市面上讲 AI Agent 的文章,十篇里有八篇是 Python 写的,剩下两篇是 TypeScript。Java 程序员想找个能直接读源码、能塞进现有 Spring 项目里的 Agent 框架,翻遍 GitHub 也就那么几个半成品。我在一个…

2026/10/19 0:28:02 阅读更多 →
开源AI编程助手Continue的VsCode插件:把settings.json改到TaoToken

开源AI编程助手Continue的VsCode插件:把settings.json改到TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:28:02 阅读更多 →
CANfestival嵌入式CANopen协议栈深度解析与STM32实战

CANfestival嵌入式CANopen协议栈深度解析与STM32实战

简介:CANfestival 是一个轻量级、模块化的开源 CANopen 协议栈实现,面向嵌入式开发者、工业通信初学者及汽车电子/自动化领域工程师,用于快速构建符合 CANopen 标准的节点设备或学习协议底层机制。资源包共 50 个文件,以 30 个头文…

2026/10/19 0:27:02 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →