基本信息
源码名称:C++17 In Detail.pdf
源码大小:1.02M
文件格式:.pdf
开发语言:C/C++
更新时间:2020-11-21
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
Contents About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii Additional Reviewers & Supporters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii Revision History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vi About the Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vii Who This Book is For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vii Overall Structure of the Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . viii Reader Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix Example Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix Part 1 - The Language Features . . . . . . . . . . . . . . . . . . . . . . . 1 Quick Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1. Fixes and Deprecation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Removed Things . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Compiler support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2. Language Clarification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Stricter Expression Evaluation Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Guaranteed Copy Elision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Dynamic Memory Allocation for Over-Aligned Data . . . . . . . . . . . . . . . . . . . . . . . 24 Exception Specifications as Part of the Type System . . . . . . . . . . . . . . . . . . . . . . . . 25 Compiler Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3. General Language Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Structured Binding Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Init Statement for if and switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Inline Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 constexpr Lambda Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 CONTENTS Nested Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Compiler support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4. Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Template Argument Deduction for Class Templates . . . . . . . . . . . . . . . . . . . . . . . . 43 Fold Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 if constexpr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Declaring Non-Type Template Parameters With auto . . . . . . . . . . . . . . . . . . . . . . 58 Other Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Compiler Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 5. Standard Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Why Do We Need Attributes? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Before C 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Attributes in C 11 and C 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 C 17 additions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Section Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Compiler support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Part 2 - The Standard Library Changes . . . . . . . . . . . . . . 73 6. std::optional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 std::optional Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Returning std::optional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Accessing The Stored Value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 std::optional Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Examples of std::optional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Performance & Memory Consideration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Migration from boost::optional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Special case: optional<bool> and optional<T*> . . . . . . . . . . . . . . . . . . . . . . . . 90 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 Compiler Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 7. std::variant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 The Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 std::variant Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Changing the Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Accessing the Stored Value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Visitors for std::variant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Other std::variant Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Exception Safety Guarantees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Performance & Memory Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 CONTENTS Migration From boost::variant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Examples of std::variant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Wrap Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Compiler Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 8. std::any . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 The Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 std::any Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Changing the Value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Accessing The Stored Value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Performance & Memory Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Migration from boost::any . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Examples of std::any . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Wrap Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Compiler Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 9. std::string_view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 The Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 The std::basic_string_view Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 std::string_view Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Other Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Risks Using string_view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Initializing string Members from string_view . . . . . . . . . . . . . . . . . . . . . . . . . 141 Handling Non-Null Terminated Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Performance & Memory Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Migration from boost::string_ref and boost::string_view . . . . . . . . . . . . . . . 148 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Wrap Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 10. String Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Elementary String Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Converting From Characters to Numbers: from_chars . . . . . . . . . . . . . . . . . . . . . 155 Converting Numbers into Characters: to_chars . . . . . . . . . . . . . . . . . . . . . . . . . . 158 The Benchmark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Compiler support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 11. Searchers & String Matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Overview of String Matching Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 New Algorithms Available in C 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 Compiler support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 CONTENTS 12. Filesystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Filesystem Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 The Path Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 The Directory Entry & Directory Iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Supporting Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Error Handling & File Races . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 Compiler Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 13. Parallel STL Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Execution Policies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 Algorithm Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 New Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Performance of Parallel Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Chapter Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 Compiler Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 14. Other Changes In The Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 std::byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Improvements for Maps and Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Return Type of Emplace Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Sampling Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 New Mathematical Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Shared Pointers and Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Non-member size(), data() and empty() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 constexpr Additions to the Standard Library . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 std::scoped_lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 std::iterator Is Deprecated . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 Polymorphic Allocator, pmr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 Compiler support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 Part 3 - More Examples and Use Cases . . . . . . . . . . . . . .255 15. Refactoring with std::optional and std::variant . . . . . . . . . . . . . . . . . . . . . 256 The Use Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 The Tuple Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 A Separate Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 With std::optional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 CONTENTS With std::variant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Wrap up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 16. Enforcing Code Contracts With [[nodiscard]] . . . . . . . . . . . . . . . . . . . . . . . . 264 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 Where Can It Be Used? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 How to Ignore [[nodiscard]] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Before C 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 17. Replacing enable_if with if constexpr - Factory with Variable Arguments . . . . . 270 The Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 Before C 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 With if constexpr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 18. How to Parallelise CSV Reader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Introduction and Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 The Serial Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 Using Parallel Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 Wrap up & Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 Appendix A - Compiler Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 Clang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 VisualStudio - MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 Compiler Support of C 17 Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 Appendix B - Resources and References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297