From b8992ad2fba6c870e287205e1766ec44c4055170 Mon Sep 17 00:00:00 2001
From: li-zhou <2181719471@qq.com>
Date: Tue, 23 Jun 2026 21:34:56 +0800
Subject: [PATCH 1/2] feat(cpp14): add 03-return-type-deduction
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Book chapter (zh + en):
- section 一/I: Basic usage — auto return in plain and template
functions
- section 二/II: Real-world case — _To_unsigned_like from vendored
msvc-stl/stl/inc/xutility, demonstrating auto-return simplifying
template function signatures
- section 三/III: Notes — consistent return types, recursion
limitation, reference stripping
- section 四/IV: Exercise topics and d2x checker command
- section 五/V: External resources
Exercise:
0. auto return type deduction — plain function, string concatenation,
template max_of. 4 D2X_YOUR_ANSWER.
Build wiring:
- register 03 target in dslings/cpp14, dslings/en/cpp14,
solutions/cpp14
- add 03 entry to zh/en SUMMARY.md
---
book/en/src/SUMMARY.md | 3 +
book/en/src/cpp14/03-return-type-deduction.md | 98 +++++++++++++++++++
book/src/SUMMARY.md | 3 +
book/src/cpp14/03-return-type-deduction.md | 98 +++++++++++++++++++
dslings/cpp14/03-return-type-deduction-0.cpp | 50 ++++++++++
dslings/cpp14/xmake.lua | 6 ++
.../en/cpp14/03-return-type-deduction-0.cpp | 50 ++++++++++
dslings/en/cpp14/xmake.lua | 6 ++
.../cpp14/03-return-type-deduction-0.cpp | 35 +++++++
solutions/cpp14/xmake.lua | 6 ++
10 files changed, 355 insertions(+)
create mode 100644 book/en/src/cpp14/03-return-type-deduction.md
create mode 100644 book/src/cpp14/03-return-type-deduction.md
create mode 100644 dslings/cpp14/03-return-type-deduction-0.cpp
create mode 100644 dslings/en/cpp14/03-return-type-deduction-0.cpp
create mode 100644 solutions/cpp14/03-return-type-deduction-0.cpp
diff --git a/book/en/src/SUMMARY.md b/book/en/src/SUMMARY.md
index b2008be..826787d 100644
--- a/book/en/src/SUMMARY.md
+++ b/book/en/src/SUMMARY.md
@@ -32,6 +32,9 @@
- [Generic Lambdas](./cpp14/00-generic-lambdas.md)
+
+- [Return Type Deduction](./cpp14/03-return-type-deduction.md)
+
# Additional Resources
- [Changelog](changelog.md)
diff --git a/book/en/src/cpp14/03-return-type-deduction.md b/book/en/src/cpp14/03-return-type-deduction.md
new file mode 100644
index 0000000..3e8f7fe
--- /dev/null
+++ b/book/en/src/cpp14/03-return-type-deduction.md
@@ -0,0 +1,98 @@
+
+
+ 🌎 [中文] | [English]
+
+
+[中文]: ../../cpp14/03-return-type-deduction.html
+[English]: ./03-return-type-deduction.html
+
+# Return Type Deduction
+
+C++14 allows functions to use `auto` as a return type without trailing `-> decltype(...)`
+
+| Book | Video | Code | X |
+| --- | --- | --- | --- |
+| [cppreference-auto](https://en.cppreference.com/w/cpp/language/auto) / [markdown](https://github.com/mcpp-community/d2mcpp/blob/main/book/en/src/cpp14/03-return-type-deduction.md) | [Video Explanation]() | [Exercise Code](https://github.com/mcpp-community/d2mcpp/blob/main/dslings/en/cpp14/03-return-type-deduction-0.cpp) | |
+
+
+**Why introduced?**
+
+- C++11 required `-> decltype(...)` trailing return for `auto` functions
+- Many simple functions don't need an explicit return type
+
+## I. Basic Usage and Scenarios
+
+### auto return — plain functions
+
+```cpp
+auto add(int a, int b) { // deduced as int
+ return a + b;
+}
+```
+
+### auto return — template functions
+
+```cpp
+template
+auto multiply(T1 a, T2 b) { // C++14: no -> decltype needed
+ return a * b;
+}
+```
+
+## II. Real-World Case — auto Return Deduction in the STL
+
+> The MSVC STL uses `auto` return types extensively to simplify template function signatures. The examples below cite the vendored [MSVC STL](https://github.com/mcpp-community/d2mcpp/tree/main/msvc-stl) (source: [`msvc-stl/stl/inc/xutility`](https://github.com/mcpp-community/d2mcpp/blob/main/msvc-stl/stl/inc/xutility#L1129-L1132)); `_NODISCARD` / `constexpr` are library-internal annotations
+
+### _To_unsigned_like — auto Return Simplifies Template Functions
+
+```cpp
+// MSVC STL · msvc-stl/stl/inc/xutility (abridged)
+template <_Integer_like _Ty>
+_NODISCARD constexpr auto _To_unsigned_like(const _Ty _Value) noexcept {
+ return static_cast<_Make_unsigned_like_t<_Ty>>(_Value);
+}
+```
+
+The return type is `_Make_unsigned_like_t<_Ty>` — without `auto`, the signature would be `_Make_unsigned_like_t<_Ty> _To_unsigned_like(...)`, with the return type longer than the function name. `auto` keeps the signature clean while the return statement naturally expresses the type
+
+## III. Notes
+
+### auto return requires consistent types
+
+```cpp
+auto bad(int x) {
+ if (x > 0) return 1; // int
+ else return 2.0; // double → error!
+}
+```
+
+### Recursion requires explicit return type
+
+```cpp
+auto factorial(int n) { // error: recursive
+ return n <= 1 ? 1 : n * factorial(n - 1);
+}
+```
+
+### auto return strips references
+
+Use `decltype(auto)` when you need to preserve references (see next chapter)
+
+## IV. Exercise Code
+
+### Exercise Topics
+
+- 0 - [auto Return Type Deduction](https://github.com/mcpp-community/d2mcpp/blob/main/dslings/en/cpp14/03-return-type-deduction-0.cpp)
+
+### Auto-Checker Command
+
+```
+d2x checker return-type-deduction
+```
+
+## V. Other
+
+- [Discussion Forum](https://forum.d2learn.org/category/20)
+- [d2mcpp Tutorial Repository](https://github.com/mcpp-community/d2mcpp)
+- [Tutorial Video List](https://space.bilibili.com/65858958/lists/5208246)
+- [Tutorial Support Tool - xlings](https://github.com/openxlings/xlings)
diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md
index 7efe83a..31d70c1 100644
--- a/book/src/SUMMARY.md
+++ b/book/src/SUMMARY.md
@@ -32,6 +32,9 @@
- [泛型 lambda - generic lambdas](./cpp14/00-generic-lambdas.md)
+
+- [返回类型推导 - return type deduction](./cpp14/03-return-type-deduction.md)
+
# 其他
- [更新日志](changelog.md)
diff --git a/book/src/cpp14/03-return-type-deduction.md b/book/src/cpp14/03-return-type-deduction.md
new file mode 100644
index 0000000..c694ba6
--- /dev/null
+++ b/book/src/cpp14/03-return-type-deduction.md
@@ -0,0 +1,98 @@
+
+
+ 🌎 [中文] | [English]
+
+
+[中文]: ./03-return-type-deduction.html
+[English]: ../en/cpp14/03-return-type-deduction.html
+
+# 返回类型推导 - return type deduction
+
+C++14 允许函数使用 `auto` 作为返回类型而无需后置 `-> decltype(...)`, 编译器从 return 语句自动推导
+
+| Book | Video | Code | X |
+| --- | --- | --- | --- |
+| [cppreference-auto](https://en.cppreference.com/w/cpp/language/auto) / [markdown](https://github.com/mcpp-community/d2mcpp/blob/main/book/src/cpp14/03-return-type-deduction.md) | [视频解读]() | [练习代码](https://github.com/mcpp-community/d2mcpp/blob/main/dslings/cpp14/03-return-type-deduction-0.cpp) | |
+
+
+**为什么引入?**
+
+- C++11 的 `auto` 返回类型必须配合 `-> decltype(...)` 后置语法
+- 很多简单函数不需要显式声明返回类型, 编译器可以从 return 语句推导出来
+
+## 一、基础用法和场景
+
+### auto 返回 — 普通函数
+
+```cpp
+auto add(int a, int b) { // 返回类型推导为 int
+ return a + b;
+}
+```
+
+### auto 返回 — 模板函数
+
+```cpp
+template
+auto multiply(T1 a, T2 b) { // C++14 不需要 -> decltype(a * b)
+ return a * b;
+}
+```
+
+## 二、真实案例 - STL 中的 auto 返回推导
+
+> MSVC STL 内部大量使用 `auto` 返回类型推导来简化模板函数签名。下面以仓库内置的 [MSVC STL](https://github.com/mcpp-community/d2mcpp/tree/main/msvc-stl) 为例 (源码: [`msvc-stl/stl/inc/xutility`](https://github.com/mcpp-community/d2mcpp/blob/main/msvc-stl/stl/inc/xutility#L1129-L1132)), `_NODISCARD` / `constexpr` 是库内部标注, 阅读时可忽略
+
+### _To_unsigned_like — auto 返回简化模板函数
+
+```cpp
+// MSVC STL · msvc-stl/stl/inc/xutility (有删节)
+template <_Integer_like _Ty>
+_NODISCARD constexpr auto _To_unsigned_like(const _Ty _Value) noexcept {
+ return static_cast<_Make_unsigned_like_t<_Ty>>(_Value);
+}
+```
+
+返回类型是 `_Make_unsigned_like_t<_Ty>`, 如果不写成 `auto`, 函数签名会变成 `_Make_unsigned_like_t<_Ty> _To_unsigned_like(...)`, 返回类型比函数名还长。`auto` 让签名简洁, 返回类型由 return 语句自然表达
+
+## 三、注意事项
+
+### auto 返回必须统一类型
+
+```cpp
+auto bad(int x) {
+ if (x > 0) return 1; // int
+ else return 2.0; // double → 错误!
+}
+```
+
+### 递归需要显式返回类型
+
+```cpp
+auto factorial(int n) { // 错误: 递归, 无法推导
+ return n <= 1 ? 1 : n * factorial(n - 1);
+}
+```
+
+### auto 返回会剥离引用
+
+需要保留引用时用 `decltype(auto)` (见下一章)
+
+## 四、练习代码
+
+### 练习代码主题
+
+- 0 - [auto 返回类型推导 — 普通函数和模板函数](https://github.com/mcpp-community/d2mcpp/blob/main/dslings/cpp14/03-return-type-deduction-0.cpp)
+
+### 练习代码自动检测命令
+
+```
+d2x checker return-type-deduction
+```
+
+## 五、其他
+
+- [交流讨论](https://forum.d2learn.org/category/20)
+- [d2mcpp教程仓库](https://github.com/mcpp-community/d2mcpp)
+- [教程视频列表](https://space.bilibili.com/65858958/lists/5208246)
+- [教程支持工具-xlings](https://github.com/openxlings/xlings)
diff --git a/dslings/cpp14/03-return-type-deduction-0.cpp b/dslings/cpp14/03-return-type-deduction-0.cpp
new file mode 100644
index 0000000..0b51000
--- /dev/null
+++ b/dslings/cpp14/03-return-type-deduction-0.cpp
@@ -0,0 +1,50 @@
+// d2mcpp: https://github.com/mcpp-community/d2mcpp
+// license: Apache-2.0
+// file: dslings/cpp14/03-return-type-deduction-0.cpp
+//
+// Exercise/练习: cpp14 | 03 - return type deduction | auto 返回类型推导
+//
+// Tips/提示:
+// - C++14 允许 auto 作为返回类型, 无需后置 -> decltype(...)
+// - 编译器从 return 语句推导返回类型
+//
+// Docs/文档:
+// - https://en.cppreference.com/w/cpp/language/auto
+// - https://github.com/mcpp-community/d2mcpp/blob/main/book/src/cpp14/03-return-type-deduction.md
+//
+// 练习交流讨论: http://forum.d2learn.org/category/20
+//
+// Auto-Checker/自动检测命令:
+//
+// d2x checker return-type-deduction
+//
+
+#include
+#include
+
+auto get_forty_two() {
+ return D2X_YOUR_ANSWER;
+}
+
+auto greet(D2X_YOUR_ANSWER name) {
+ return "hello " + D2X_YOUR_ANSWER;
+}
+
+template
+D2X_YOUR_ANSWER max_of(T1 a, T2 b) {
+ return a > b ? a : b;
+}
+
+int main() {
+
+ d2x_assert_eq(get_forty_two(), 42);
+
+ d2x_assert(greet(std::string("world")) == "hello world");
+
+ d2x_assert_eq(max_of(10, 20), 20);
+ d2x_assert_eq(max_of(2.5, D2X_YOUR_ANSWER), 3.5);
+
+ D2X_WAIT
+
+ return 0;
+}
diff --git a/dslings/cpp14/xmake.lua b/dslings/cpp14/xmake.lua
index 8a21cbf..572bc65 100644
--- a/dslings/cpp14/xmake.lua
+++ b/dslings/cpp14/xmake.lua
@@ -9,3 +9,9 @@ target("cpp14-00-generic-lambdas-0")
target("cpp14-00-generic-lambdas-1")
set_kind("binary")
add_files("00-generic-lambdas-1.cpp")
+
+-- target: cpp14-03-return-type-deduction
+
+target("cpp14-03-return-type-deduction-0")
+ set_kind("binary")
+ add_files("03-return-type-deduction-0.cpp")
diff --git a/dslings/en/cpp14/03-return-type-deduction-0.cpp b/dslings/en/cpp14/03-return-type-deduction-0.cpp
new file mode 100644
index 0000000..7af50f4
--- /dev/null
+++ b/dslings/en/cpp14/03-return-type-deduction-0.cpp
@@ -0,0 +1,50 @@
+// d2mcpp: https://github.com/mcpp-community/d2mcpp
+// license: Apache-2.0
+// file: dslings/en/cpp14/03-return-type-deduction-0.cpp
+//
+// Exercise: cpp14 | 03 - return type deduction | auto return type deduction
+//
+// Tips:
+// - C++14 allows auto as a return type without trailing -> decltype(...)
+// - The compiler deduces the return type from the return statement
+//
+// Docs:
+// - https://en.cppreference.com/w/cpp/language/auto
+// - https://github.com/mcpp-community/d2mcpp/blob/main/book/en/src/cpp14/03-return-type-deduction.md
+//
+// Discussion Forum: http://forum.d2learn.org/category/20
+//
+// Auto-Checker:
+//
+// d2x checker return-type-deduction
+//
+
+#include
+#include
+
+auto get_forty_two() {
+ return D2X_YOUR_ANSWER;
+}
+
+auto greet(D2X_YOUR_ANSWER name) {
+ return "hello " + D2X_YOUR_ANSWER;
+}
+
+template
+D2X_YOUR_ANSWER max_of(T1 a, T2 b) {
+ return a > b ? a : b;
+}
+
+int main() {
+
+ d2x_assert_eq(get_forty_two(), 42);
+
+ d2x_assert(greet(std::string("world")) == "hello world");
+
+ d2x_assert_eq(max_of(10, 20), 20);
+ d2x_assert_eq(max_of(2.5, D2X_YOUR_ANSWER), 3.5);
+
+ D2X_WAIT
+
+ return 0;
+}
diff --git a/dslings/en/cpp14/xmake.lua b/dslings/en/cpp14/xmake.lua
index 8a21cbf..572bc65 100644
--- a/dslings/en/cpp14/xmake.lua
+++ b/dslings/en/cpp14/xmake.lua
@@ -9,3 +9,9 @@ target("cpp14-00-generic-lambdas-0")
target("cpp14-00-generic-lambdas-1")
set_kind("binary")
add_files("00-generic-lambdas-1.cpp")
+
+-- target: cpp14-03-return-type-deduction
+
+target("cpp14-03-return-type-deduction-0")
+ set_kind("binary")
+ add_files("03-return-type-deduction-0.cpp")
diff --git a/solutions/cpp14/03-return-type-deduction-0.cpp b/solutions/cpp14/03-return-type-deduction-0.cpp
new file mode 100644
index 0000000..dceda1a
--- /dev/null
+++ b/solutions/cpp14/03-return-type-deduction-0.cpp
@@ -0,0 +1,35 @@
+// d2mcpp: https://github.com/mcpp-community/d2mcpp
+// license: Apache-2.0
+// reference solution for: dslings/cpp14/03-return-type-deduction-0.cpp
+//
+// 用途: 仅给 CI 与维护者参考使用,不是教程入口。
+// 教程练习入口: dslings/cpp14/03-return-type-deduction-0.cpp
+//
+
+#include
+#include
+
+auto get_forty_two() {
+ return 42;
+}
+
+auto greet(const std::string& name) {
+ return "hello " + name;
+}
+
+template
+auto max_of(T1 a, T2 b) {
+ return a > b ? a : b;
+}
+
+int main() {
+
+ d2x_assert_eq(get_forty_two(), 42);
+
+ d2x_assert(greet(std::string("world")) == "hello world");
+
+ d2x_assert_eq(max_of(10, 20), 20);
+ d2x_assert_eq(max_of(2.5, 3.5), 3.5);
+
+ return 0;
+}
diff --git a/solutions/cpp14/xmake.lua b/solutions/cpp14/xmake.lua
index 8bbbb90..d246660 100644
--- a/solutions/cpp14/xmake.lua
+++ b/solutions/cpp14/xmake.lua
@@ -9,3 +9,9 @@ target("cpp14-00-generic-lambdas-0-ref")
target("cpp14-00-generic-lambdas-1-ref")
set_kind("binary")
add_files("00-generic-lambdas-1.cpp")
+
+-- target: cpp14-03-return-type-deduction
+
+target("cpp14-03-return-type-deduction-0-ref")
+ set_kind("binary")
+ add_files("03-return-type-deduction-0.cpp")
From 60ac733b3dc30ebce4e8afd2fac4768423a621f8 Mon Sep 17 00:00:00 2001
From: li-zhou <2181719471@qq.com>
Date: Tue, 23 Jun 2026 21:44:23 +0800
Subject: [PATCH 2/2] docs(cpp14): reserve booking slot in SUMMARY for
03-return-type-deduction
---
book/en/src/SUMMARY.md | 2 --
book/src/SUMMARY.md | 2 --
2 files changed, 4 deletions(-)
diff --git a/book/en/src/SUMMARY.md b/book/en/src/SUMMARY.md
index 826787d..41bd31f 100644
--- a/book/en/src/SUMMARY.md
+++ b/book/en/src/SUMMARY.md
@@ -31,8 +31,6 @@
# C++14 Core Language Features
- [Generic Lambdas](./cpp14/00-generic-lambdas.md)
-
-
- [Return Type Deduction](./cpp14/03-return-type-deduction.md)
# Additional Resources
diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md
index 31d70c1..c110145 100644
--- a/book/src/SUMMARY.md
+++ b/book/src/SUMMARY.md
@@ -31,8 +31,6 @@
# C++14核心语言特性
- [泛型 lambda - generic lambdas](./cpp14/00-generic-lambdas.md)
-
-
- [返回类型推导 - return type deduction](./cpp14/03-return-type-deduction.md)
# 其他