-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
311 lines (286 loc) · 49.6 KB
/
index.html
File metadata and controls
311 lines (286 loc) · 49.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>肖恩的博客</title><meta name="author" content="Sean"><meta name="copyright" content="Sean"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="像风走了八千里,不问归期">
<meta property="og:type" content="website">
<meta property="og:title" content="肖恩的博客">
<meta property="og:url" content="https://devilsean.github.io/index.html">
<meta property="og:site_name" content="肖恩的博客">
<meta property="og:description" content="像风走了八千里,不问归期">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://devilsean.github.io/img/avatar.jpg">
<meta property="article:author" content="Sean">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://devilsean.github.io/img/avatar.jpg"><script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "肖恩的博客",
"alternateName": [
"devilsean.github.io"
],
"url": "https://devilsean.github.io/"
}</script><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://devilsean.github.io/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css?v=5.5.1"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@7.1.0/css/all.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui@6.0.33/dist/fancybox/fancybox.min.css" media="print" onload="this.media='all'"><script>
(() => {
const saveToLocal = {
set: (key, value, ttl) => {
if (!ttl) return
const expiry = Date.now() + ttl * 86400000
localStorage.setItem(key, JSON.stringify({ value, expiry }))
},
get: key => {
const itemStr = localStorage.getItem(key)
if (!itemStr) return undefined
const { value, expiry } = JSON.parse(itemStr)
if (Date.now() > expiry) {
localStorage.removeItem(key)
return undefined
}
return value
}
}
window.btf = {
saveToLocal,
getScript: (url, attr = {}) => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
Object.entries(attr).forEach(([key, val]) => script.setAttribute(key, val))
script.onload = script.onreadystatechange = () => {
if (!script.readyState || /loaded|complete/.test(script.readyState)) resolve()
}
script.onerror = reject
document.head.appendChild(script)
}),
getCSS: (url, id) => new Promise((resolve, reject) => {
const link = document.createElement('link')
link.rel = 'stylesheet'
link.href = url
if (id) link.id = id
link.onload = link.onreadystatechange = () => {
if (!link.readyState || /loaded|complete/.test(link.readyState)) resolve()
}
link.onerror = reject
document.head.appendChild(link)
}),
addGlobalFn: (key, fn, name = false, parent = window) => {
if (!false && key.startsWith('pjax')) return
const globalFn = parent.globalFn || {}
globalFn[key] = globalFn[key] || {}
globalFn[key][name || Object.keys(globalFn[key]).length] = fn
parent.globalFn = globalFn
}
}
const activateDarkMode = () => {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
const activateLightMode = () => {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
btf.activateDarkMode = activateDarkMode
btf.activateLightMode = activateLightMode
const theme = saveToLocal.get('theme')
theme === 'dark' ? activateDarkMode() : theme === 'light' ? activateLightMode() : null
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
document.documentElement.classList.toggle('hide-aside', asideStatus === 'hide')
}
const detectApple = () => {
if (/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)) {
document.documentElement.classList.add('apple')
}
}
detectApple()
})()
</script><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: undefined,
translate: undefined,
highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false,"highlightFullpage":false,"highlightMacStyle":false},
copy: {
success: '复制成功',
error: '复制失败',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: false,
post: false
},
runtime: '',
dateSuffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: undefined,
lightbox: 'fancybox',
Snackbar: undefined,
infinitegrid: {
js: 'https://cdn.jsdelivr.net/npm/@egjs/infinitegrid@4.12.0/dist/infinitegrid.min.js',
buttonText: '加载更多'
},
isPhotoFigcaption: false,
islazyloadPlugin: false,
isAnchor: false,
percent: {
toc: true,
rightside: false,
},
autoDarkmode: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: '肖恩的博客',
isHighlightShrink: false,
isToc: false,
pageType: 'home'
}</script><link rel="stylesheet" href="/css/custom.css" media="defer" onload="this.media='all'"><!-- hexo injector head_end start --><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper/swiper-bundle.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Zfour/Butterfly-card-history/baiduhistory/css/main.css"><link rel="stylesheet" href="https://npm.elemecdn.com/hexo-butterfly-categories-card@1.0.0/lib/categorybar.css"><link rel="stylesheet" href="https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiperstyle.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://npm.elemecdn.com/hexo-butterfly-wowjs/lib/animate.min.css" media="print" onload="this.media='screen'"><!-- hexo injector head_end end --><meta name="generator" content="Hexo 8.1.0"></head><body><div id="web_bg" style="background-image: url(/img/background.jpg);"></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img text-center"><img src="/img/avatar.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data text-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">74</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">88</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">3</div></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 归档</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-info-circle"></i><span> 关于</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="full_page" id="page-header"><nav id="nav"><span id="blog-info"><a class="nav-site-title" href="/"><span class="site-name">肖恩的博客</span></a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 归档</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-info-circle"></i><span> 关于</span></a></div></div><div id="toggle-menu"><span class="site-page"><i class="fas fa-bars fa-fw"></i></span></div></div></nav><div id="site-info"><h1 id="site-title">肖恩的博客</h1><div id="site-subtitle"><span id="subtitle"></span></div></div><div id="scroll-down"><i class="fas fa-angle-down scroll-down-effects"></i></div></header><main class="layout" id="content-inner"><div class="recent-posts nc" id="recent-posts"><div class="recent-post-items"><div class="recent-post-item"><div class="post_cover left"><a href="/posts/43ae7cb1.html" title="Item1:理解模板类型推导"><img class="post-bg" src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item1:理解模板类型推导"></a></div><div class="recent-post-info"><a class="article-title" href="/posts/43ae7cb1.html" title="Item1:理解模板类型推导">Item1:理解模板类型推导</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/Effective-Modern-C/">Effective Modern C++</a></span></div><div class="content">函数模板形如: 12template<typename T> void f(ParamType param); 一次调用形如: 1f(expr); //以某表达式调用 f 在编译期,编译器会通过expr推导T的类型和ParamType的类型(通常会包含一些修饰,例如const或引用符号等限定)。 T的类型推导结果分以下三种情况讨论: 1. ParamType 具有指针或引用型别,但不是万能引用类型推导规则如下: 若expr具有引用类型,先将引用部分忽略。 然后,对expr的类型和ParamType的类型执行模式匹配,来决定T的类型。 举例模式声明如下: 12template<typename T> void f(T& param); // param 是个引用 声明下列变量: 123int x = 27; // x 的类型是 intconst int xx= x; // cx 的类型是 const intconst int& rx = x; // rx 是 x 的类型为 const int 的引用 各次调用的推导结果如下: 12...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/posts/43ae7cb1.html" title="Item3:理解 decltype 类型推导"><img class="post-bg" src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item3:理解 decltype 类型推导"></a></div><div class="recent-post-info"><a class="article-title" href="/posts/43ae7cb1.html" title="Item3:理解 decltype 类型推导">Item3:理解 decltype 类型推导</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/Effective-Modern-C/">Effective Modern C++</a></span></div><div class="content">个人认为原著写的非常晦涩难懂,所以精简如下: decltype用于告知名字或表达式的类型: 1234567891011121314151617181920212223const int i = 0; // decltype(i) 是 const intbool f(const Widget& w); // decltype(w) 是 const Widget&;decltype(f) 是 bool(const Widget&)struct Point { int x, y;}; // decltype(Point::x) 是 int;decltype(Point::y) 是 intWidget w; // decltype(w) 是 Widgetif (f(w)) ... // decltype(f(w)) 是 booltemplate<typename T&...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/posts/43ae7cb1.html" title="Item2:理解 auto 类型推导"><img class="post-bg" src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item2:理解 auto 类型推导"></a></div><div class="recent-post-info"><a class="article-title" href="/posts/43ae7cb1.html" title="Item2:理解 auto 类型推导">Item2:理解 auto 类型推导</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/Effective-Modern-C/">Effective Modern C++</a></span></div><div class="content">推导方式和[[1. 理解模板类型推导]]一致,下面讨论不同点: 在初始化时,采用auto声明变量相比于采用固定类型声明变量更具优势。下列声明都能通过编译,但是结果却并不相同: 1234auto x1 = 27; // 类型是int,值是27auto x2(27); // 同上auto x3 = {27}; // 类型是std::initializer_list<int>,值是{27}auto x4{27}; //同上 当用于auto声明变量的初始化表达式是使用大括号时,推导所得类型就属于std::initializer_list<int>。如果类型推导失败(例如大括号里的值类型不一样),代码就不通过编译: 1auto x5 = {1,2,3.0}; // 错误,推导不出std::initializer_list<T>中的T 这里发生了两次类型推导: auto的使用:x5的类型需要推导,由于x5的初始表达式是用大括号,所以x5必须推导为一个std::initi...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/posts/43ae7cb1.html" title="Item4:掌握查看类型推导结果的方法"><img class="post-bg" src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item4:掌握查看类型推导结果的方法"></a></div><div class="recent-post-info"><a class="article-title" href="/posts/43ae7cb1.html" title="Item4:掌握查看类型推导结果的方法">Item4:掌握查看类型推导结果的方法</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/Effective-Modern-C/">Effective Modern C++</a></span></div><div class="content">采用何种工具来查看型别推导结果,取决于在软件开发过程的哪个阶段需要该信息。三个可能的阶段:撰写代码阶段、编译阶段和运行时阶段。 IDE编辑器IDE 中的代码编辑器通常会在你将鼠标指针悬停至某个程序实体,如变量、形参、函数等时,显示出该实体的类型。例如: 1234const int theAnswer = 42;auto x = theAnswer;auto y = &theAnswer; IDE 编辑器很可能会显示出,x 的类型推导结果是 int, 而 y 则是 const int*。 但是如果遇到较为复杂的类型,IDE显示的信息就不太有用了。 编译器诊断信息一条有效途径是使用该类型导致某些编译错误。而报告错误的消息几乎肯定会提及导致该错误的类型。 例如: 12template<typename T> //只声明TD而不定义class TD; // TD是“类型显示类”的缩写 只要试图具现该模板,就会诱发一个错误信息,原因是找不到具现模板所需要的定义。 运行时输出使用 printf来显示类型信息,这种方法只有到了运行期才能使用,却可以对类型输出的格式提供完...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/posts/43ae7cb1.html" title="Item10:优先选用限域枚举,而非不限域枚举"><img class="post-bg" src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item10:优先选用限域枚举,而非不限域枚举"></a></div><div class="recent-post-info"><a class="article-title" href="/posts/43ae7cb1.html" title="Item10:优先选用限域枚举,而非不限域枚举">Item10:优先选用限域枚举,而非不限域枚举</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/Effective-Modern-C/">Effective Modern C++</a></span></div><div class="content">使用限域enum来减少命名空间污染通用规则:如果在一对大括号里声明一个名字,则该名字的可见性限定在括号括起来的作用域内。 但这个规则不适用于 C++98 风格的枚举类型中定义的枚举变量:枚举变量的属于包含着这个枚举类型的作用域,此作用域内不能有其他实体取相同的名字。 12enum Color { black, white, red }; //black, white, red在Color所在的作用域auto white = false; //错误! white早已在这个作用域中声明 枚举量的名字泄露到枚举类型所在作用域的现象被称为:不限范围的枚举类型(未限域 enum)。 在 C++11 中,限定作用域的枚举类型(枚举类 / 限域 enum)不会以这样的方式泄露名字: 123456enum class Color { black, white, red }; //black, white, red限制在Color域内auto white = false; //没问题,域内没有其他“white”Color c = white; /...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/posts/43ae7cb1.html" title="Item12:使用override重写声明函数"><img class="post-bg" src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item12:使用override重写声明函数"></a></div><div class="recent-post-info"><a class="article-title" href="/posts/43ae7cb1.html" title="Item12:使用override重写声明函数">Item12:使用override重写声明函数</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/Effective-Modern-C/">Effective Modern C++</a></span></div><div class="content">面向对象编程的基本理念是:在派生类中虚函数实现,会改写基类中对应虚函数的实现。 虚函数重写的约束条件要想重写一个函数,必须满足下列要求: 基类中的函数必须是虚函数。 基类和派生类中的函数名字必须完全相同(析构函数例外)。 基类和派生类中的函数形参类型必须完全相同。 基类和派生类中的函数常量性必须完全相同。 基类和派生类中的函数返回值和异常规格必须兼容。 基类和派生类中的函数引用限定符必须完全相同。(C++11新增) 引用限定符:限定类的非静态成员函数只能被左值对象或右值对象调用。带&的成员函数仅允许左值对象调用;带&&的成员函数仅允许右值对象调用。 如果基类中的虚函数带有引用饰词,则派生类要对该函数进行改写版本必须也带有完全相同的引用饰词。否则相当于重新定义了一个新的函数。 编译器可能不报警但是存在错误的例子: 123456789101112131415class Base {public: virtual void mf1() const; virtual void mf2(int x); virtual void m...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/posts/43ae7cb1.html" title="Item6:当auto推导的类型不符合要求时,使用显式类型初始化习惯用法"><img class="post-bg" src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item6:当auto推导的类型不符合要求时,使用显式类型初始化习惯用法"></a></div><div class="recent-post-info"><a class="article-title" href="/posts/43ae7cb1.html" title="Item6:当auto推导的类型不符合要求时,使用显式类型初始化习惯用法">Item6:当auto推导的类型不符合要求时,使用显式类型初始化习惯用法</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/Effective-Modern-C/">Effective Modern C++</a></span></div><div class="content">个人认为原著写的非常难懂,所以精简总结如下: auto与代理类的问题当使用auto进行类型推导时,如果表达式返回的是代理类,auto会推导出代理类型而不是被代理的实际类型,可能导致未定义行为。 例如: 123std::vector<bool> features(const Widget& w);bool highPriority = features(w)[5]; // 含义是w具有高优先级吗?processWidget(w, highPriority); // 按照w的优先级来处理 这段代码没有什么问题,但是如果把highPriority从显式类型改成auto: 12auto highPriority = features(w)[5]; // 危险!推导出std::vector<bool>::referenceprocessWidget(w, highPriority); // 可能产生未定义行为! 原因: std::vector<bool>内部使用紧凑结构存储(每个bool占1位) 内存最小寻址单位是字...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/posts/43ae7cb1.html" title="Item5:优先使用 auto,而非显式类型声明"><img class="post-bg" src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item5:优先使用 auto,而非显式类型声明"></a></div><div class="recent-post-info"><a class="article-title" href="/posts/43ae7cb1.html" title="Item5:优先使用 auto,而非显式类型声明">Item5:优先使用 auto,而非显式类型声明</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/Effective-Modern-C/">Effective Modern C++</a></span></div><div class="content">传统显示类型声明存在的问题1. 忘记初始化产生未知行为但是,auto声明的变量其类型推导自其初始化表达式,所以它们必须初始化: 123int x1; // 有潜在的未初始化风险 auto x2; // 编译错误!必须有初始化表达式auto x3 = 0; // 没问题, x 已经定义了 2. 类型冗长复杂,难以直接写出在泛型编程、容器操作等场景中,尝尝会出现冗长复杂的类型声明。如:typename std::iterator_traits<It>::value_type,可以直接使用auto代替。 12345// 传统显式声明:冗长繁琐,易出错 typename std::vector<int>::const_iterator it1 = vec.cbegin(); // auto 声明:简洁高效,无需记忆复杂类型 auto it2 = vec.cbegin(); 3. 类型不匹配导致意外的类型转换std::function是C++11标准库中的一个模板,它把函数指针的思想加以推广。函数指针只能指向函数,而std::function却可以指向任何可调用...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/posts/43ae7cb1.html" title="Item13:优先选用const_iterator,而非iterator"><img class="post-bg" src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item13:优先选用const_iterator,而非iterator"></a></div><div class="recent-post-info"><a class="article-title" href="/posts/43ae7cb1.html" title="Item13:优先选用const_iterator,而非iterator">Item13:优先选用const_iterator,而非iterator</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/Effective-Modern-C/">Effective Modern C++</a></span></div><div class="content">STL 的const_iterator等价于 “指向常量的指针(pointer-to-const)”,指向的值不可修改,符合 “能加const就加” 的通用编程准则 —— 只要无需修改迭代器指向的值,就应优先使用const_iterator;但该迭代器的实用性随 C++ 版本迭代大幅提升,C++11 是关键转折点,同时通用代码中需优先使用非成员函数版本的begin/end/cbegin等。 各 C++ 版本对 const_iterator 的支持差异1. C++98:支持残缺,实用性差const_iterator理论上符合规范,但实际使用存在两大痛点: 创建麻烦:非const容器无法直接获取const_iterator,需强制类型转换(或绑定到const引用)才能得到; 使用受限:insert/erase等容器操作仅接受iterator,且const_iterator无法可移植转换为iterator(即使reinterpret_cast也不行); 最终导致开发者被迫放弃使用,违背 “能const则const” 的准则。 123456789101112typedef s...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/posts/43ae7cb1.html" title="Item15:尽可能使用constexpr"><img class="post-bg" src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item15:尽可能使用constexpr"></a></div><div class="recent-post-info"><a class="article-title" href="/posts/43ae7cb1.html" title="Item15:尽可能使用constexpr">Item15:尽可能使用constexpr</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/Effective-Modern-C/">Effective Modern C++</a></span></div><div class="content">constexpr作用于对象时,是加强版的const;但作用于函数时含义截然不同 —— 它并非简单限定 “返回 const 值” 或 “结果编译期可知”,而是根据调用场景动态适配。 constexpr对象:必然具备const只读属性,且必须由编译期可知的值完成初始化(技术上是翻译期,包含编译 + 链接,编程层面可视为编译期)。 constexpr函数:不保证返回值是 const,也不保证结果一定编译期可知—— 结果是否编译期确定,完全取决于传入的实参: 若实参是编译期已知的常量 → 结果在编译期计算,可用于 “整型常量表达式” 语境; 若实参是运行期才能确定的值 → 函数退化为普通函数,在运行期计算结果。 编译期可知的常量整型值,可用于 C++ 要求 “整型常量表达式” 的核心语境:数组尺寸、整型模板实参(如std::array的长度)、枚举量的值、对齐修饰符(alignas)等。普通const对象无法满足这些场景(仅保证只读,不保证编译期初始化),因此: 所有constexpr对象都是const对象,但并非所有const对象都是constexpr对象。 cons...</div></div></div></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span><a class="page-number" href="/page/2/#content-inner">2</a><span class="space">…</span><a class="page-number" href="/page/8/#content-inner">8</a><a class="extend next" rel="next" href="/page/2/#content-inner"><i class="fas fa-chevron-right fa-fw"></i></a></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info text-center"><div class="avatar-img"><img src="/img/avatar.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info-name">Sean</div><div class="author-info-description">像风走了八千里,不问归期</div><div class="site-data"><a href="/archives/"><div class="headline">文章</div><div class="length-num">74</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">88</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">3</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/Devilsean"><i class="fab fa-github"></i><span>Follow Me</span></a></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content">载着零散思绪与滚烫热爱,与同频的你相遇。</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/posts/43ae7cb1.html" title="Item1:理解模板类型推导"><img src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item1:理解模板类型推导"/></a><div class="content"><a class="title" href="/posts/43ae7cb1.html" title="Item1:理解模板类型推导">Item1:理解模板类型推导</a><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/posts/43ae7cb1.html" title="Item3:理解 decltype 类型推导"><img src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item3:理解 decltype 类型推导"/></a><div class="content"><a class="title" href="/posts/43ae7cb1.html" title="Item3:理解 decltype 类型推导">Item3:理解 decltype 类型推导</a><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/posts/43ae7cb1.html" title="Item2:理解 auto 类型推导"><img src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item2:理解 auto 类型推导"/></a><div class="content"><a class="title" href="/posts/43ae7cb1.html" title="Item2:理解 auto 类型推导">Item2:理解 auto 类型推导</a><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/posts/43ae7cb1.html" title="Item4:掌握查看类型推导结果的方法"><img src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item4:掌握查看类型推导结果的方法"/></a><div class="content"><a class="title" href="/posts/43ae7cb1.html" title="Item4:掌握查看类型推导结果的方法">Item4:掌握查看类型推导结果的方法</a><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/posts/43ae7cb1.html" title="Item10:优先选用限域枚举,而非不限域枚举"><img src="/./img/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Item10:优先选用限域枚举,而非不限域枚举"/></a><div class="content"><a class="title" href="/posts/43ae7cb1.html" title="Item10:优先选用限域枚举,而非不限域枚举">Item10:优先选用限域枚举,而非不限域枚举</a><time datetime="2026-03-15T12:00:00.000Z" title="发表于 2026-03-15 20:00:00">2026-03-15</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline">
<i class="fas fa-folder-open"></i>
<span>分类</span>
</div>
<ul class="card-category-list" id="aside-cat-list">
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/C/"><span class="card-category-list-name">C++</span><span class="card-category-list-count">30</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/Effective-Modern-C/"><span class="card-category-list-name">Effective Modern C++</span><span class="card-category-list-count">42</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E8%AF%97%E8%AF%8D%E6%AD%8C%E8%B5%8B/"><span class="card-category-list-name">诗词歌赋</span><span class="card-category-list-count">2</span></a></li>
</ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/atomic/" style="font-size: 1.1em; color: #999">atomic</a> <a href="/tags/%E8%AF%97%E8%AF%8D%E6%AD%8C%E8%B5%8B/" style="font-size: 1.1em; color: #999">诗词歌赋</a> <a href="/tags/make-unique/" style="font-size: 1.1em; color: #999">make_unique</a> <a href="/tags/%E8%BF%90%E7%AE%97%E7%AC%A6%E9%87%8D%E8%BD%BD/" style="font-size: 1.1em; color: #999">运算符重载</a> <a href="/tags/%E7%BD%91%E7%BB%9C/" style="font-size: 1.37em; color: #99a4b2">网络</a> <a href="/tags/%E5%AF%B9%E8%B1%A1/" style="font-size: 1.1em; color: #999">对象</a> <a href="/tags/%E7%BB%A7%E6%89%BF/" style="font-size: 1.1em; color: #999">继承</a> <a href="/tags/auto/" style="font-size: 1.37em; color: #99a4b2">auto</a> <a href="/tags/%E6%A8%A1%E6%9D%BF%E7%B1%BB%E5%9E%8B%E6%8E%A8%E5%AF%BC/" style="font-size: 1.1em; color: #999">模板类型推导</a> <a href="/tags/%E9%97%AE%E9%A2%98/" style="font-size: 1.1em; color: #999">问题</a> <a href="/tags/decltype/" style="font-size: 1.23em; color: #999ea6">decltype</a> <a href="/tags/%E4%BA%8C%E8%BF%9B%E5%88%B6/" style="font-size: 1.1em; color: #999">二进制</a> <a href="/tags/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/" style="font-size: 1.1em; color: #999">数据类型</a> <a href="/tags/%E7%BA%BF%E7%A8%8B/" style="font-size: 1.23em; color: #999ea6">线程</a> <a href="/tags/%E5%BC%95%E7%94%A8/" style="font-size: 1.1em; color: #999">引用</a> <a href="/tags/C/" style="font-size: 1.5em; color: #99a9bf">C++</a> <a href="/tags/%E6%BB%95%E7%8E%8B%E9%98%81%E5%BA%8F/" style="font-size: 1.1em; color: #999">滕王阁序</a> <a href="/tags/%E5%88%9D%E5%A7%8B%E5%8C%96/" style="font-size: 1.1em; color: #999">初始化</a> <a href="/tags/%E5%88%AB%E5%90%8D%E5%A3%B0%E6%98%8E/" style="font-size: 1.1em; color: #999">别名声明</a> <a href="/tags/%E5%86%85%E5%AD%98%E5%88%86%E5%8C%BA/" style="font-size: 1.1em; color: #999">内存分区</a> <a href="/tags/%E6%8C%87%E9%92%88/" style="font-size: 1.1em; color: #999">指针</a> <a href="/tags/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/" style="font-size: 1.1em; color: #999">函数式编程</a> <a href="/tags/future/" style="font-size: 1.1em; color: #999">future</a> <a href="/tags/%E5%9F%BA%E7%A1%80/" style="font-size: 1.23em; color: #999ea6">基础</a> <a href="/tags/%E5%BC%82%E6%AD%A5/" style="font-size: 1.1em; color: #999">异步</a> <a href="/tags/%E4%BB%BB%E5%8A%A1/" style="font-size: 1.1em; color: #999">任务</a> <a href="/tags/shared-ptr/" style="font-size: 1.1em; color: #999">shared_ptr</a> <a href="/tags/%E6%8A%92%E6%83%85/" style="font-size: 1.1em; color: #999">抒情</a> <a href="/tags/%E5%8F%8B%E5%85%83/" style="font-size: 1.1em; color: #999">友元</a> <a href="/tags/IO%E6%A8%A1%E5%9E%8B/" style="font-size: 1.1em; color: #999">IO模型</a> <a href="/tags/%E9%A2%84%E5%A4%84%E7%90%86/" style="font-size: 1.1em; color: #999">预处理</a> <a href="/tags/Pimpl/" style="font-size: 1.1em; color: #999">Pimpl</a> <a href="/tags/%E5%87%BD%E6%95%B0/" style="font-size: 1.1em; color: #999">函数</a> <a href="/tags/%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86/" style="font-size: 1.1em; color: #999">文本处理</a> <a href="/tags/%E7%A7%BB%E5%8A%A8%E6%93%8D%E4%BD%9C/" style="font-size: 1.1em; color: #999">移动操作</a> <a href="/tags/RAII/" style="font-size: 1.1em; color: #999">RAII</a> <a href="/tags/STL/" style="font-size: 1.1em; color: #999">STL</a> <a href="/tags/thread/" style="font-size: 1.23em; color: #999ea6">thread</a> <a href="/tags/%E9%80%9A%E7%94%A8%E5%BC%95%E7%94%A8/" style="font-size: 1.23em; color: #999ea6">通用引用</a> <a href="/tags/%E6%96%87%E4%BB%B6IO/" style="font-size: 1.37em; color: #99a4b2">文件IO</a></div></div><div class="card-widget card-archives">
<div class="item-headline">
<i class="fas fa-archive"></i>
<span>归档</span>
</div>
<ul class="card-archive-list">
<li class="card-archive-list-item">
<a class="card-archive-list-link" href="/archives/2026/03/">
<span class="card-archive-list-date">
三月 2026
</span>
<span class="card-archive-list-count">42</span>
</a>
</li>
<li class="card-archive-list-item">
<a class="card-archive-list-link" href="/archives/2025/11/">
<span class="card-archive-list-date">
十一月 2025
</span>
<span class="card-archive-list-count">1</span>
</a>
</li>
<li class="card-archive-list-item">
<a class="card-archive-list-link" href="/archives/2025/10/">
<span class="card-archive-list-date">
十月 2025
</span>
<span class="card-archive-list-count">31</span>
</a>
</li>
</ul>
</div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站信息</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">74</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总浏览量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2026-03-17T12:07:32.751Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div class="footer-other"><div class="footer-copyright"><span class="copyright">© 2025 - 2026 By Sean</span><span class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo 8.1.0</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly 5.5.1</a></span></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="日间和夜间模式切换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button><button id="go-down" type="button" title="直达底部" onclick="btf.scrollToDest(document.body.scrollHeight, 500)"><i class="fas fa-arrow-down"></i></button></div></div><div><script src="/js/utils.js?v=5.5.1"></script><script src="/js/main.js?v=5.5.1"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui@6.0.33/dist/fancybox/fancybox.umd.min.js"></script><div class="js-pjax"><script>window.typedJSFn = {
init: str => {
window.typed = new Typed('#subtitle', Object.assign({
strings: str,
startDelay: 300,
typeSpeed: 150,
loop: true,
backSpeed: 50,
}, null))
},
run: subtitleType => {
if (true) {
if (typeof Typed === 'function') {
subtitleType()
} else {
btf.getScript('https://cdn.jsdelivr.net/npm/typed.js@2.1.0/dist/typed.umd.min.js').then(subtitleType)
}
} else {
subtitleType()
}
},
processSubtitle: (content, extraContents = []) => {
if (true) {
const sub = [].slice()
if (extraContents.length > 0) {
sub.unshift(...extraContents)
}
if (typeof content === 'string') {
sub.unshift(content)
} else if (Array.isArray(content)) {
sub.unshift(...content)
}
sub.length > 0 && typedJSFn.init(sub)
} else {
document.getElementById('subtitle').textContent = typeof content === 'string' ? content :
(Array.isArray(content) && content.length > 0 ? content[0] : '')
}
}
}
btf.addGlobalFn('pjaxSendOnce', () => { typed.destroy() }, 'typedDestroy')
</script><script>function subtitleType () {
fetch('https://v1.hitokoto.cn')
.then(response => response.json())
.then(data => {
const from = '出自 ' + data.from
typedJSFn.processSubtitle(data.hitokoto, [from])
})
.catch(err => {
console.error('Failed to get the Hitokoto API:', err)
typedJSFn.processSubtitle([])
})
}
typedJSFn.run(subtitleType)
</script></div><canvas id="snow"></canvas><script async src="/js/snow.js"></script><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div><!-- hexo injector body_end start --><script data-pjax>function history_calendar_injector_config(){
var parent_div_git = document.getElementsByClassName('sticky_layout')[0];
var item_html = '<div class="card-widget card-history"> <!-- 挂载容器 --> <div class="card-content"> <div class="item-headline"> <i class="fas fa-clock fa-spin"></i> <span>那年今日</span> </div> <div id="history-baidu" style="height: 100px;overflow: hidden"> <!-- 挂载器 --> <div class="history_swiper-container" id="history-container" style="width: 100%;height: 100%"> <div class="swiper-wrapper" id="history_container_wrapper" style="height:20px"></div> </div> </div> </div>';
console.log('已挂载history_calendar')
// parent_div_git.innerHTML=item_html+parent_div_git.innerHTML // 无报错,但不影响使用(支持pjax跳转)
parent_div_git.insertAdjacentHTML("afterbegin",item_html) // 有报错,但不影响使用(支持pjax跳转)
}if( document.getElementsByClassName('sticky_layout')[0] && (location.pathname ==='all'|| 'all' ==='all')){
history_calendar_injector_config()
} </script><script data-pjax src="https://cdn.jsdelivr.net/npm/swiper/swiper-bundle.min.js"></script><script data-pjax src="https://cdn.jsdelivr.net/gh/Zfour/Butterfly-card-history/baiduhistory/js/main.js"></script><script data-pjax>
function butterfly_categories_card_injector_config(){
var parent_div_git = document.getElementById('recent-posts');
var item_html = '<style>li.categoryBar-list-item{width:32.3%;}.categoryBar-list{max-height: 380px;overflow:auto;}.categoryBar-list::-webkit-scrollbar{width:0!important}@media screen and (max-width: 650px){.categoryBar-list{max-height: 320px;}}</style><div class="recent-post-item" style="height:auto;width:100%;padding:0px;"><div id="categoryBar"><ul class="categoryBar-list"><li class="categoryBar-list-item" style="background:url(./img/poem.png);"> <a class="categoryBar-list-link" href="categories/诗词歌赋/">诗词歌赋</a><span class="categoryBar-list-count">2</span><span class="categoryBar-list-descr">有格调</span></li><li class="categoryBar-list-item" style="background:url(./img/fwC++.png);"> <a class="categoryBar-list-link" href="categories/C/">C++</a><span class="categoryBar-list-count">30</span><span class="categoryBar-list-descr">有生活</span></li><li class="categoryBar-list-item" style="background:url(./img/Effective-Modern-C++.jpg);"> <a class="categoryBar-list-link" href="categories/Effective-Modern-C/">Effective Modern C++</a><span class="categoryBar-list-count">42</span><span class="categoryBar-list-descr">有品位</span></li></ul></div></div>';
console.log('已挂载butterfly_categories_card')
parent_div_git.insertAdjacentHTML("afterbegin",item_html)
}
if( document.getElementById('recent-posts') && (location.pathname ==='/'|| '/' ==='all')){
butterfly_categories_card_injector_config()
}
</script><script data-pjax>
function butterfly_swiper_injector_config(){
var parent_div_git = document.getElementById('recent-posts');
var item_html = '<div class="recent-post-item" style="height: auto;width: 100%"><div class="blog-slider swiper-container-fade swiper-container-horizontal" id="swiper_container"><div class="blog-slider__wrp swiper-wrapper" style="transition-duration: 0ms;"><div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;"><a class="blog-slider__img" href="posts/5c7e22c2.html" alt=""><img width="48" height="48" src="../../img/post/tengwangge.jpg" alt="" onerror="this.src=https://unpkg.zhimg.com/akilar-candyassets/image/loading.gif; this.onerror = null;"/></a><div class="blog-slider__content"><span class="blog-slider__code">2025-11-01</span><a class="blog-slider__title" href="posts/5c7e22c2.html" alt="">滕王阁序</a><div class="blog-slider__text">难得糊涂</div><a class="blog-slider__button" href="posts/5c7e22c2.html" alt="">详情 </a></div></div><div class="blog-slider__item swiper-slide" style="width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;"><a class="blog-slider__img" href="posts/9a70fb8f.html" alt=""><img width="48" height="48" src="../../img/post/gongbaitou.jpg" alt="" onerror="this.src=https://unpkg.zhimg.com/akilar-candyassets/image/loading.gif; this.onerror = null;"/></a><div class="blog-slider__content"><span class="blog-slider__code">2025-10-29</span><a class="blog-slider__title" href="posts/9a70fb8f.html" alt="">共白头</a><div class="blog-slider__text">难得糊涂</div><a class="blog-slider__button" href="posts/9a70fb8f.html" alt="">详情 </a></div></div></div><div class="blog-slider__pagination swiper-pagination-clickable swiper-pagination-bullets"></div></div></div>';
console.log('已挂载butterfly_swiper')
parent_div_git.insertAdjacentHTML("afterbegin",item_html)
}
var elist = 'undefined'.split(',');
var cpage = location.pathname;
var epage = '/';
var flag = 0;
for (var i=0;i<elist.length;i++){
if (cpage.includes(elist[i])){
flag++;
}
}
if ((epage ==='all')&&(flag == 0)){
butterfly_swiper_injector_config();
}
else if (epage === cpage){
butterfly_swiper_injector_config();
}
</script><script defer src="https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper.min.js"></script><script defer data-pjax src="https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper_init.js"></script><div class="js-pjax"><script async="async">var arr = document.getElementsByClassName('recent-post-item');
for(var i = 0;i<arr.length;i++){
arr[i].classList.add('wow');
arr[i].classList.add('animate__zoomIn');
arr[i].setAttribute('data-wow-duration', '1s');
arr[i].setAttribute('data-wow-delay', '0s');
arr[i].setAttribute('data-wow-offset', '100');
arr[i].setAttribute('data-wow-iteration', '1');
}</script><script async="async">var arr = document.getElementsByClassName('card-widget');
for(var i = 0;i<arr.length;i++){
arr[i].classList.add('wow');
arr[i].classList.add('animate__zoomIn');
arr[i].setAttribute('data-wow-duration', '');
arr[i].setAttribute('data-wow-delay', '');
arr[i].setAttribute('data-wow-offset', '');
arr[i].setAttribute('data-wow-iteration', '');
}</script></div><script defer src="https://npm.elemecdn.com/hexo-butterfly-wowjs/lib/wow.min.js"></script><script defer src="https://npm.elemecdn.com/hexo-butterfly-wowjs/lib/wow_init.js"></script><!-- hexo injector body_end end --><script src="/live2dw/lib/L2Dwidget.min.js?094cbace49a39548bed64abff5988b05"></script><script>L2Dwidget.init({"pluginRootPath":"live2dw/","pluginJsPath":"lib/","pluginModelPath":"assets/","tagMode":false,"debug":false,"model":{"jsonPath":"/live2dw/assets/assets/miku.model.json"},"display":{"position":"left","width":200,"height":350,"hOffset":-15,"vOffset":18},"mobile":{"show":true},"react":{"opacity":0.8},"log":false});</script></body></html>