本篇可以结合 Left-to-Right vs. Right-to-Left Coding Styles 阅读,属于同一主题。本篇侧重于讲解具体的类型推导规则。 Decltype Specifier 在静态类型语言中,一个变量需要由类型说明符指定,而随着 C++ 的发展,类型也可以从表达式推导出来,不必显式写出。 一切始于 C++11 decltype(E),Decltype 也属于说明符,接受一个表达式参数。也可以传入一个变量,因为变量名属于 id-expressions,也是表达式。 这里的核心在于,表达式其实包含三部分信息:type, value, 和 value category。使用 Decltype 推导出的表达式结果与原类型的信息并不总是相同,这种不一样的依据就是类型推导规则。 Decltype 的推导规则需要分为两种情况讨论,E 和 (E),也就是说,多加一个括号将改变推导规则。 先来看第一种,E 的情况。 如果 E 是 id-expressions 或者类成员名称访问,此时推导结果的 type 和 value 都和 E 所对应的实体相同,但是不会保留原有的 value category。 int a = 42; static_assert(std::is_same_v<decltype(a), int>); std::println("lvalue:… Continue Reading Mastering Placeholder Type Deduction

进入 Modern C++,声明风格由 Right-to-Left 逐渐转变为 Left-to-Right,个中差异,优劣得失,且看本篇内容。 前言 Classic C++ 中,声明风格是自右向左,如: int f() {} int a = 42; std::string s{"str"}; 而 Modern C++ 中变为自左向右,对应写法为: auto f() -> int {} auto a = 42; auto s = std::string{"str"}; 其实很多编程语言都采用或支持 Left-to-Right 这种声明风格,下面列举几种。 Rust: fn f(num: i32) -> i32 {} let x = f(5);… Continue Reading Left-to-Right vs. Right-to-Left Coding Styles