From 1d6f890db428771d97eb72a0cae10ca5149a92d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BD=92=E6=95=85=E9=87=8C?= <3326284481@qq.com>
Date: Sun, 17 Mar 2024 14:43:24 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=96=87=E4=BB=B6=E7=A9=BA?=
=?UTF-8?q?=E6=A0=BC=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=BA=9B=20README?=
=?UTF-8?q?=20=E6=96=87=E4=BB=B6=EF=BC=8C=E5=88=9B=E5=BB=BA=20SUMMARY=20?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BB=A5=E6=94=AF=E6=8C=81=20GitBook?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
SUMMARY.md | 23 ++
...2\347\253\240-\347\220\206\345\277\265.md" | 4 +-
.../README.md" | 15 +
...347\241\200C++\351\242\230\347\233\256.md" | 76 ++---
...04\344\275\277\347\224\250\357\274\211.md" | 138 ++++-----
...04\351\200\200\345\214\226\357\274\211.md" | 274 +++++++++---------
.../README.md" | 9 +
7 files changed, 293 insertions(+), 246 deletions(-)
create mode 100644 SUMMARY.md
create mode 100644 "src/\345\215\242\347\221\237\346\227\245\347\273\217/README.md"
rename "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231002 \345\237\272\347\241\200C++\351\242\230\347\233\256.md" => "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231002\345\237\272\347\241\200C++\351\242\230\347\233\256.md" (94%)
rename "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231017 \345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\350\275\254\346\215\242\347\232\204\344\275\277\347\224\250\357\274\211.md" => "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231017\345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\350\275\254\346\215\242\347\232\204\344\275\277\347\224\250\357\274\211.md" (96%)
rename "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231126 \345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\346\225\260\347\273\204\351\200\200\345\214\226\357\274\211.md" => "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231126\345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\346\225\260\347\273\204\351\200\200\345\214\226\357\274\211.md" (95%)
create mode 100644 "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/README.md"
diff --git a/SUMMARY.md b/SUMMARY.md
new file mode 100644
index 00000000..d9d5a62a
--- /dev/null
+++ b/SUMMARY.md
@@ -0,0 +1,23 @@
+# Summary
+
+* [作业与解析](README.md)
+* [C++CoreGuidelines](src/C++CoreGuidelines/README.md)
+ - [第一章-简介](src/C++CoreGuidelines/第1章-简介.md)
+ - [第二章-理念](src/C++CoreGuidelines/第2章-理念.md)
+ - [第三章-接口](src/C++CoreGuidelines/第3章-接口.md)
+ - [第四章-函数](src/C++CoreGuidelines/第4章-函数.md)
+ - [第五章-类和类层次结构](src/C++CoreGuidelines/第5章-类和类层次结构.md)
+* [卢瑟日经](src/卢瑟日经/README.md)
+ - [赋值运算符求值顺序的问题](src/卢瑟日经/赋值运算符求值顺序问题.md)
+ - [函数调用禁止隐式转换](src/卢瑟日经/函数调用禁止隐式转换.md)
+ - [数组&指针](src/卢瑟日经/数组&指针.md)
+ - [同步、异步、阻塞](src/卢瑟日经/同步、异步、阻塞.md)
+ - [为什么优先成员初始化器](src/卢瑟日经/为什么优先成员初始化器.md)
+ - [重载operator=要不要检查自赋值?](src/卢瑟日经/重载operator=要不要检查自赋值?.md)
+ - [C&C++伪规则和错误的看法](src/卢瑟日经/C&C++伪规则和错误的看法.md)
+ - [catch(auto)的问题](src/卢瑟日经/catch(auto)的问题.md)
+ - [detach的问题](src/卢瑟日经/detach的问题.md)
+* [基础性C++题目与答案](src/基础性C++题目/README.md)
+ - [20231002 基础C++题目](src/基础性C++题目/20231002基础C++题目.md)
+ - [20231017基础C++题目(转换的使用)](src/基础性C++题目/20231017基础C++题目(转换的使用).md)
+ - [20231126基础C++题目(数组退化)](src/基础性C++题目/20231126基础C++题目(数组退化).md)
diff --git "a/src/C++CoreGuidelines/\347\254\2542\347\253\240-\347\220\206\345\277\265.md" "b/src/C++CoreGuidelines/\347\254\2542\347\253\240-\347\220\206\345\277\265.md"
index 3343a506..a268c1f0 100644
--- "a/src/C++CoreGuidelines/\347\254\2542\347\253\240-\347\220\206\345\277\265.md"
+++ "b/src/C++CoreGuidelines/\347\254\2542\347\253\240-\347\220\206\345\277\265.md"
@@ -13,7 +13,7 @@
理念性规则概览:
- [理念](#理念)
- + [▌P.1 在代码中直接表达思想](#p1-在代码中直接表达思想)
+ + [P.1 在代码中直接表达思想](#p1-在代码中直接表达思想)
+ [P.2 用 ISO 标准写代码](#p2-用-iso-标准写代码)
+ [P.3 表达意图](#p3-表达意图)
+ [P.4 理想情况下,程序应该是静态类型安全的](#p4-理想情况下程序应该是静态类型安全的)
@@ -31,7 +31,7 @@
> 如果觉得没听懂不用在意,的确有点抽象,可以简单理解为一般情况下的编码规范。
-## ▌P.1 在代码中直接表达思想
+## P.1 在代码中直接表达思想
编译器是不会去读注释(或设计文档)的,许多程序员也(固执地)不去读它们。 而代码中所表达的东西是带有 **明确的语义** 的,并且(原则上)是可以由编译器和其他工具进行检验的。
diff --git "a/src/\345\215\242\347\221\237\346\227\245\347\273\217/README.md" "b/src/\345\215\242\347\221\237\346\227\245\347\273\217/README.md"
new file mode 100644
index 00000000..a67781c6
--- /dev/null
+++ "b/src/\345\215\242\347\221\237\346\227\245\347\273\217/README.md"
@@ -0,0 +1,15 @@
+# 卢瑟日经
+
+一些常见的卢瑟问题。
+
+**目录一览**:
+
+- [赋值运算符求值顺序的问题](赋值运算符求值顺序问题.md)
+- [函数调用禁止隐式转换](函数调用禁止隐式转换.md)
+- [数组&指针](数组&指针.md)
+- [同步、异步、阻塞](同步、异步、阻塞.md)
+- [为什么优先成员初始化器](为什么优先成员初始化器.md)
+- [重载operator=要不要检查自赋值?](重载operator=要不要检查自赋值?.md)
+- [C&C++伪规则和错误的看法](C&C++伪规则和错误的看法.md)
+- [catch(auto)的问题](catch(auto)的问题.md)
+- [detach的问题](detach的问题.md)
diff --git "a/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231002 \345\237\272\347\241\200C++\351\242\230\347\233\256.md" "b/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231002\345\237\272\347\241\200C++\351\242\230\347\233\256.md"
similarity index 94%
rename from "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231002 \345\237\272\347\241\200C++\351\242\230\347\233\256.md"
rename to "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231002\345\237\272\347\241\200C++\351\242\230\347\233\256.md"
index bbe93d95..b7178b16 100644
--- "a/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231002 \345\237\272\347\241\200C++\351\242\230\347\233\256.md"
+++ "b/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231002\345\237\272\347\241\200C++\351\242\230\347\233\256.md"
@@ -1,38 +1,38 @@
-# 20231002 基础 C++题目
-
-## 题目
-
-下面展示的代码
-
-```C++
-#include
-
-struct foo{
- char a[16];
-};
-
-int main(){
- foo a {"Hello, World!"};
- auto b = a;
- a.a[0] = '\0';
- std::cout << b.a;
-}
-```
-
-其行为是:
-
-- A. 无法编译/未定义行为
-- B. 可编译,保证无输出
-- C. 可编译,保证输出`"Hello, World!"`
-- D. 可编译,输出为实现定义
-
-## 答案
-
-C
-
-## 解析
-
-虽然数组类型不能直接赋值,但是作为类类型成员的数组类型,默认复制赋值函数的行为是逐元素复制。
-
-- 此赋值行为在 C 语言也是成立的。
-- 切忌将 foo::a 理解成指针。
+# 20231002 基础 C++题目
+
+## 题目
+
+下面展示的代码
+
+```C++
+#include
+
+struct foo{
+ char a[16];
+};
+
+int main(){
+ foo a {"Hello, World!"};
+ auto b = a;
+ a.a[0] = '\0';
+ std::cout << b.a;
+}
+```
+
+其行为是:
+
+- A. 无法编译/未定义行为
+- B. 可编译,保证无输出
+- C. 可编译,保证输出`"Hello, World!"`
+- D. 可编译,输出为实现定义
+
+## 答案
+
+C
+
+## 解析
+
+虽然数组类型不能直接赋值,但是作为类类型成员的数组类型,默认复制赋值函数的行为是逐元素复制。
+
+- 此赋值行为在 C 语言也是成立的。
+- 切忌将 foo::a 理解成指针。
diff --git "a/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231017 \345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\350\275\254\346\215\242\347\232\204\344\275\277\347\224\250\357\274\211.md" "b/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231017\345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\350\275\254\346\215\242\347\232\204\344\275\277\347\224\250\357\274\211.md"
similarity index 96%
rename from "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231017 \345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\350\275\254\346\215\242\347\232\204\344\275\277\347\224\250\357\274\211.md"
rename to "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231017\345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\350\275\254\346\215\242\347\232\204\344\275\277\347\224\250\357\274\211.md"
index 91de62fb..3107db39 100644
--- "a/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231017 \345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\350\275\254\346\215\242\347\232\204\344\275\277\347\224\250\357\274\211.md"
+++ "b/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231017\345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\350\275\254\346\215\242\347\232\204\344\275\277\347\224\250\357\274\211.md"
@@ -1,69 +1,69 @@
-# 20231017 基础 C++题目
-
-## 题目
-
-### 1. 下面展示的代码应当使用
-
-```C++
-struct Base { int x; };
-struct Derived : Base { int y; }
-
-int get_xy(Base * param){
- auto pd = ????_cast(param);
- return pd->x * pd->y;
-}
-```
-
-- A. static_cast
-- B. dynamic_cast
-- C. 以上全部
-- D. 不允许转换
-
-### 2. 下面展示的代码应当使用
-
-```C++
-void erased_call(void (* pfn)(void), const char * param){
- auto typed_pfn = ????_cast(pfn);
- typed_pfn(param);
-}
-```
-
-- A. static_cast
-- B. reinterpret_cast
-- C. 以上全部
-- D. 不允许转换
-
-### 3. 下面展示的代码应当使用
-
-```C++
-template
-void foo(T&& i){
- // some implemetion code
-}
-
-void speciallized_foo(int param){
- auto spfoo = ????_cast(foo);
- spfoo(param);
-}
-```
-
-- A. static_cast
-- B. reinterpret_cast
-- C. 以上全部
-- D. 不允许转换
-
-## 答案
-
-1. A
-2. B
-3. A
-
-## 解析
-
-1. 此处 `Base` 并非多态类型,因此 `dynamic_cast` 无法进行基类指针到派生类指针的转换,而 `static_cast` 可以,[如](https://godbolt.org/z/8nGEvPTE8)。
- + 你可以为 `Base` 添加虚函数成员,使其成为多态类型,此时`dynamic_cast` 可以用于基类到派生类的转换。
- + 注意 `static_cast` 并不像 `dynamic_cast` 那样具有 [RTTI](https://zh.wikipedia.org/zh-hans/%E5%9F%B7%E8%A1%8C%E6%9C%9F%E5%9E%8B%E6%85%8B%E8%A8%8A%E6%81%AF) ,无法转换时不会返回 `nullptr` 或抛出异常。通过不合法的转换得到的指针去访问成员会产生[未定义行为](https://zh.cppreference.com/w/cpp/language/ub)。
-2. `reinterpret_cast`可以用于函数指针的转换,而 `static_cast` 不可以。
- + 此处 `reinterpret_cast` 并不会产生实际转换代码。
- + 普通指针 `void *` 和函数指针 `void (*)(void)` 在一些平台上的长度不同,C++ 标准并不保证这两种类型能够以 `reinterpret_cast` 互相转换。
-3. 进行 `static_cast` 转换的时候会发生重载决议,模板函数会实例化为选择到的函数类型,再隐式转换为函数指针。
+# 20231017 基础 C++题目
+
+## 题目
+
+### 1. 下面展示的代码应当使用
+
+```C++
+struct Base { int x; };
+struct Derived : Base { int y; }
+
+int get_xy(Base * param){
+ auto pd = ????_cast(param);
+ return pd->x * pd->y;
+}
+```
+
+- A. static_cast
+- B. dynamic_cast
+- C. 以上全部
+- D. 不允许转换
+
+### 2. 下面展示的代码应当使用
+
+```C++
+void erased_call(void (* pfn)(void), const char * param){
+ auto typed_pfn = ????_cast(pfn);
+ typed_pfn(param);
+}
+```
+
+- A. static_cast
+- B. reinterpret_cast
+- C. 以上全部
+- D. 不允许转换
+
+### 3. 下面展示的代码应当使用
+
+```C++
+template
+void foo(T&& i){
+ // some implemetion code
+}
+
+void speciallized_foo(int param){
+ auto spfoo = ????_cast(foo);
+ spfoo(param);
+}
+```
+
+- A. static_cast
+- B. reinterpret_cast
+- C. 以上全部
+- D. 不允许转换
+
+## 答案
+
+1. A
+2. B
+3. A
+
+## 解析
+
+1. 此处 `Base` 并非多态类型,因此 `dynamic_cast` 无法进行基类指针到派生类指针的转换,而 `static_cast` 可以,[如](https://godbolt.org/z/8nGEvPTE8)。
+ + 你可以为 `Base` 添加虚函数成员,使其成为多态类型,此时`dynamic_cast` 可以用于基类到派生类的转换。
+ + 注意 `static_cast` 并不像 `dynamic_cast` 那样具有 [RTTI](https://zh.wikipedia.org/zh-hans/%E5%9F%B7%E8%A1%8C%E6%9C%9F%E5%9E%8B%E6%85%8B%E8%A8%8A%E6%81%AF) ,无法转换时不会返回 `nullptr` 或抛出异常。通过不合法的转换得到的指针去访问成员会产生[未定义行为](https://zh.cppreference.com/w/cpp/language/ub)。
+2. `reinterpret_cast`可以用于函数指针的转换,而 `static_cast` 不可以。
+ + 此处 `reinterpret_cast` 并不会产生实际转换代码。
+ + 普通指针 `void *` 和函数指针 `void (*)(void)` 在一些平台上的长度不同,C++ 标准并不保证这两种类型能够以 `reinterpret_cast` 互相转换。
+3. 进行 `static_cast` 转换的时候会发生重载决议,模板函数会实例化为选择到的函数类型,再隐式转换为函数指针。
diff --git "a/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231126 \345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\346\225\260\347\273\204\351\200\200\345\214\226\357\274\211.md" "b/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231126\345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\346\225\260\347\273\204\351\200\200\345\214\226\357\274\211.md"
similarity index 95%
rename from "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231126 \345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\346\225\260\347\273\204\351\200\200\345\214\226\357\274\211.md"
rename to "src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231126\345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\346\225\260\347\273\204\351\200\200\345\214\226\357\274\211.md"
index d5380c18..2a0ad76e 100644
--- "a/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231126 \345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\346\225\260\347\273\204\351\200\200\345\214\226\357\274\211.md"
+++ "b/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/20231126\345\237\272\347\241\200C++\351\242\230\347\233\256\357\274\210\346\225\260\347\273\204\351\200\200\345\214\226\357\274\211.md"
@@ -1,137 +1,137 @@
-# 20231017 基础 C++题目
-
-## 题目
-
-### 1.下面展示的代码的行为是
-
-```C++
-#include
-#include
-
-template
-bool foo(T* param) {
- return std::is_same::value;
-}
-
-int main() {
- char arr[]{"Hello, World!"};
- std::cout << foo(arr);
-}
-```
-
-- A. 无法编译/未定义行为
-- B. 可编译,保证输出"0"
-- C. 可编译,保证输出"1"
-- D. 可编译,输出为实现定义
-
-### 2.下面展示的代码的行为是
-
-```C++
-#include
-#include
-
-template
-bool foo(T& param) {
- return std::is_same::value;
-}
-
-int main() {
- char arr[]{"Hello, World!"};
- std::cout << foo(arr);
-}
-```
-
-- A. 无法编译/未定义行为
-- B. 可编译,保证输出"0"
-- C. 可编译,保证输出"1"
-- D. 可编译,输出为实现定义
-
-### 3.下面展示的代码的行为是
-
-```C++
-#include
-
-template
-size_t foo(T param) {
- return sizeof(param);
-}
-
-template
-size_t foo(T & param) {
- return sizeof(param);
-}
-
-int main() {
- char arr[2];
- std::cout << foo(arr) == sizeof(arr);
-}
-```
-
-- A. 无法编译/未定义行为
-- B. 可编译,保证输出"0"
-- C. 可编译,保证输出"1"
-- D. 可编译,输出为实现定义
-
-### 4.下面展示的代码的行为是
-
-```C++
-#include
-#include
-
-template
-bool foo(T param1, U param2) {
- return std::is_same::value;
-}
-
-int main() {
- char arr[]{"Hello, World!"};
- const char * str = "Hello, World!";
- std::cout << foo(arr,str);
-}
-```
-
-- A. 无法编译/未定义行为
-- B. 可编译,保证输出"0"
-- C. 可编译,保证输出"1"
-- D. 可编译,输出为实现定义
-
-### 5.下面展示的代码的行为是
-
-```C++
-#include
-#include
-
-extern char arr[];
-
-template
-bool foo(T & param1, char param2[]){
- return std::is_same::value;
-}
-
-int main() {
- std::cout << foo(arr, arr);
-}
-
-char arr[] = "Hello, World";
-```
-
-- A. 无法编译/未定义行为
-- B. 可编译,保证输出"0"
-- C. 可编译,保证输出"1"
-- D. 可编译,输出为实现定义
-
-## 答案
-
-1. C
-2. B
-3. A
-4. B
-5. B
-
-## 解析
-
-1. 基本的数组退化现象,`param` 的类型为 `char*`,`T*` 会推导为 `char*`,`std::is_same::value` 为 `true`。
-2. 没有 `T*` 形式的推导的时候,`T&` 会推导为 `char (&)[13]`,`std::is_same::value` 为 `false`。
-3. 此处 `foo(T param)` 会推导为 `foo(char * param)`,`foo(T¶m)` 会推导为 `foo(char (&)[2])`,这里是相同优先级的转换,导致重载决议冲突,无法编译。
-4. `arr` 的类型为 `char[13]`,退化得到的是 `char*`,`str` 的类型为 `const char*`,`std::is_same::value` 为`false`。
-5. 此处 `arr` 是 unbounded array,`param1` 的类型会推导得到数组的引用,`T`是数组类型,而 `param2` 是指针类型, `std::is_same::value` 为 `false`。
+# 20231017 基础 C++题目
+
+## 题目
+
+### 1.下面展示的代码的行为是
+
+```C++
+#include
+#include
+
+template
+bool foo(T* param) {
+ return std::is_same::value;
+}
+
+int main() {
+ char arr[]{"Hello, World!"};
+ std::cout << foo(arr);
+}
+```
+
+- A. 无法编译/未定义行为
+- B. 可编译,保证输出"0"
+- C. 可编译,保证输出"1"
+- D. 可编译,输出为实现定义
+
+### 2.下面展示的代码的行为是
+
+```C++
+#include
+#include
+
+template
+bool foo(T& param) {
+ return std::is_same::value;
+}
+
+int main() {
+ char arr[]{"Hello, World!"};
+ std::cout << foo(arr);
+}
+```
+
+- A. 无法编译/未定义行为
+- B. 可编译,保证输出"0"
+- C. 可编译,保证输出"1"
+- D. 可编译,输出为实现定义
+
+### 3.下面展示的代码的行为是
+
+```C++
+#include
+
+template
+size_t foo(T param) {
+ return sizeof(param);
+}
+
+template
+size_t foo(T & param) {
+ return sizeof(param);
+}
+
+int main() {
+ char arr[2];
+ std::cout << foo(arr) == sizeof(arr);
+}
+```
+
+- A. 无法编译/未定义行为
+- B. 可编译,保证输出"0"
+- C. 可编译,保证输出"1"
+- D. 可编译,输出为实现定义
+
+### 4.下面展示的代码的行为是
+
+```C++
+#include
+#include
+
+template
+bool foo(T param1, U param2) {
+ return std::is_same::value;
+}
+
+int main() {
+ char arr[]{"Hello, World!"};
+ const char * str = "Hello, World!";
+ std::cout << foo(arr,str);
+}
+```
+
+- A. 无法编译/未定义行为
+- B. 可编译,保证输出"0"
+- C. 可编译,保证输出"1"
+- D. 可编译,输出为实现定义
+
+### 5.下面展示的代码的行为是
+
+```C++
+#include
+#include
+
+extern char arr[];
+
+template
+bool foo(T & param1, char param2[]){
+ return std::is_same::value;
+}
+
+int main() {
+ std::cout << foo(arr, arr);
+}
+
+char arr[] = "Hello, World";
+```
+
+- A. 无法编译/未定义行为
+- B. 可编译,保证输出"0"
+- C. 可编译,保证输出"1"
+- D. 可编译,输出为实现定义
+
+## 答案
+
+1. C
+2. B
+3. A
+4. B
+5. B
+
+## 解析
+
+1. 基本的数组退化现象,`param` 的类型为 `char*`,`T*` 会推导为 `char*`,`std::is_same::value` 为 `true`。
+2. 没有 `T*` 形式的推导的时候,`T&` 会推导为 `char (&)[13]`,`std::is_same::value` 为 `false`。
+3. 此处 `foo(T param)` 会推导为 `foo(char * param)`,`foo(T¶m)` 会推导为 `foo(char (&)[2])`,这里是相同优先级的转换,导致重载决议冲突,无法编译。
+4. `arr` 的类型为 `char[13]`,退化得到的是 `char*`,`str` 的类型为 `const char*`,`std::is_same::value` 为`false`。
+5. 此处 `arr` 是 unbounded array,`param1` 的类型会推导得到数组的引用,`T`是数组类型,而 `param2` 是指针类型, `std::is_same::value` 为 `false`。
diff --git "a/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/README.md" "b/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/README.md"
new file mode 100644
index 00000000..2372cd9e
--- /dev/null
+++ "b/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/README.md"
@@ -0,0 +1,9 @@
+# 基础性C++题目
+
+纯基础,由 [Da'Inihlus](https://github.com/dynilath) 制作。
+
+**目录一览**:
+
+- [20231002 基础C++题目](20231002基础C++题目.md)
+- [20231017基础C++题目(转换的使用)](20231017基础C++题目(转换的使用).md)
+- [20231126基础C++题目(数组退化)](20231126基础C++题目(数组退化).md)