悬停
为光标所在的符号显示内容丰富的信息卡片。
符号信息
限定名
悬停卡片显示符号所在的命名空间和类作用域
符号种类
卡片标明符号的种类:结构体、枚举、函数、字段等
访问说明符
成员显示其 public / protected / private 访问权限
定义显示
卡片包含符号在源代码中的定义
初始化器截断
过大的初始化器会截断显示,不会完整呈现
显示的定义省略了初始化器,求值后的 Value 字段只显示 256 个元素中的前十个。
虚函数修饰符
方法的悬停卡片显示 virtual / override / final
源代码中写出的修饰符会显示出来(virtual … = 0、override、final),但如果重写方法省略了多余的 virtual 关键字,卡片就不会表明它是虚函数,也就无法呈现该 issue 要求的 virtual void draw() override 形式。
匿名命名空间作用域
作用域中显示 (anonymous namespace)
卡片可以显示,但作用域会省略匿名部分:顶层匿名命名空间中的成员完全没有作用域一行,而 outer::(anonymous) 只显示为 outer。
类型信息
变量类型
变量的悬停卡片保留指针、引用和数组声明符
变量卡片以易读的格式显示其声明类型,指针、引用和数组声明符的写法与源代码一致。
类型别名
悬停卡片可以用 aka 形式显示去除语法糖后的类型
带有语法糖的类型会以 Alias (aka int) 的形式显示其底层类型。show_aka 选项可以关闭 aka 后缀。
函数签名
函数的悬停卡片显示返回类型、参数名和默认实参
函数卡片列出返回类型、每个参数及其名称,以及所有默认实参。
模板形参
模板的悬停卡片区分类型形参、模板模板形参和非类型形参
各类模板形参按各自的形式显示:类型形参、模板模板形参,以及带有默认值的非类型形参。
auto 推导
占位符的悬停卡片显示推导出的类型
将光标悬停在 auto 占位符上,会显示替换它的类型,包括内置类型、指针、Lambda 和模板实例化类型;在尚未实例化的模板中,则显示 /* not deduced */ 标记。
decltype 推导
decltype 的悬停卡片区分值类型、引用类型和依赖形式
将光标悬停在 decltype 或 decltype(auto) 占位符上,会显示解析得到的类型,包括根据带括号表达式规则添加的引用。
CTAD
类占位符的悬停卡片显示推导出的模板实参
使用类模板实参推导(CTAD)时,变量卡片会显示推导出的 Box<int>,但将光标悬停在类名上时,仍然只显示不带实参的主模板。
实例化实参
模板使用处的悬停卡片尚不显示形参与实参的绑定关系
在模板使用处,卡片会显示替换后的类型(Wrapper<int>、identity<int>、int x),但不会以 T = int 这样的形式明确列出各形参与其绑定实参的映射关系。
Lambda 的 auto 参数
泛型 Lambda 参数尚不显示推导出的类型
悬停于泛型 Lambda 的 auto 参数时,不会显示卡片,也不会显示推导出的参数类型。
保留别名的 auto
auto 推导后仍保留别名的写法
悬停时保留别名的写法,并附上展开别名后的类型,因此从别名返回类型推导出的 auto 会显示为 Outer // aka: int。
类型格式化
显示较长或嵌套的类型时,不会重新换行或对齐
较长或嵌套的类型不会重新换行或对齐。
匿名结构体的 typedef
悬停于 C 语言的 typedef 时,以别名作为匿名结构体的名称
悬停于别名或该类型的变量时,都会显示简洁的 Point 卡片,而不会将匿名类型显示为另有名称的结构体。
Concept 约束
悬停于受约束的占位符时,约束信息会丢失
受约束参数和 Concept 引用的卡片都包含约束信息,但悬停于受约束的 Addable auto 变量的占位符时,只显示推导出的类型,约束信息会丢失。
布局信息
字段布局
悬停于字段时,显示大小、偏移量、对齐和填充信息
类型布局
悬停于类型本身时,显示其大小、对齐和填充信息
目前类型卡片会显示大小和对齐信息,尚不显示总填充大小。
虚函数表偏移量
虚方法会显示其在虚函数表中的槽位
目前方法卡片不显示任何虚函数表信息。
表达式上下文
常量求值
悬停于常量表达式时,显示求值结果
当初始化器是常量表达式时,卡片会对其求值并显示结果。
调用实参
悬停于实参时,标明其绑定的形参
悬停于调用处的实参时,显示它所传入的形参,并给出所绑定形参的名称。
传递语义
悬停于实参时,区分值传递和引用传递
实参卡片会说明值如何传递给被调用方:按值复制,或绑定到可修改的引用形参或常量引用形参。
隐式转换
悬停于实参时,显示隐式转换的目标类型
当实参通过隐式转换传递给形参时,卡片会注明目标类型,内置转换和用户定义转换均如此。
字符串字面量
悬停于字符串字面量时,显示其字节大小
字符串字面量卡片会显示数组类型及其字节大小(const char[6]、Size: 6 bytes,即字符串长度加上空字符终止符),而不会明确显示字符数。
数值字面量
悬停于数值字面量时,尚不显示类型或值
悬停于数值字面量时不会显示卡片,而字符字面量和字符串字面量则会显示类型和值。
记录类型变量
悬停于记录类型时,可能会显示所属外层表达式的常量值,造成误导
对于可在编译期求值的调用,目前悬停于其记录类型实参时,变量上会显示该调用的值(Value = 7),而这个值并非记录本身的值。
文档
Doxygen /// 注释
悬停时显示声明的文档
适用于普通函数、主模板及其特化;引用会解析到特化程度最高的声明所附的注释。
合成访问器文档
为简单的 getter/setter 生成单行描述
如果简单的 getter 或 setter 没有自己的注释,悬停卡片中会自动生成一行 "Trivial accessor/setter for field." 描述。
@copydoc 标签
复制的文档尚未解析并关联到接收文档的符号
@copydoc target 标签会保留原文,不会将 target 的文档复制到当前符号的悬停卡片中。
重写方法的文档继承
没有注释的重写方法尚不能继承基类方法的文档
如果重写方法没有自己的注释,其悬停卡片中就没有描述。
重载间的文档共享
后续重载尚不能复用第一个重载的文档
连续声明的重载通常只为第一个编写文档;后续没有文档的重载在悬停卡片中没有描述。
继承构造函数的文档
继承构造函数的文档尚不能在悬停时显示
using Base::Base; 声明中的名称会解析到类,而非继承的构造函数,因此无法通过悬停查看基类构造函数的文档。
横幅注释
用空行隔开的分节横幅注释仍会关联到后面的声明
// ==== Section ==== 横幅注释即使后面有空行,也会被错误地当作下方声明的文档,因此横幅文本会出现在卡片中。
声明与定义处的注释
声明处的文档优先于定义处的注释
在声明和定义处悬停时,显示的都是声明处的 /// 文档,而非定义处的普通 // 注释。
空白与换行
注释中的 Markdown 表格在悬停时会丢失换行
写在多行 /// 注释中的 Markdown 表格会被合并为一行,导致表格无法渲染。
注释缩进
文档中缩进的块在悬停时会丢失行首缩进
如果文档注释的正文包含缩进块,该块的缩进会丢失,空行也会被合并掉。
宏生成的模板关键字
宏生成的模板在悬停时不显示文档
当 template 关键字由宏展开生成时,声明的文档注释不会在悬停时显示,卡片中没有描述。
注释屏蔽选项
尚不能通过配置屏蔽错误关联的文档
与代码用空行隔开的分节横幅等无关注释总会出现在悬停卡片中,且没有选项可以屏蔽。
宏悬停
各处均显示定义文本
在 #define、使用处、#ifdef、defined 和 #undef 处均显示宏定义
无论宏名称出现在何处,其悬停卡片都会显示对应的 #define 文本:包括宏定义本身、使用处、#ifdef 条件判断处、defined 检测处以及 #undef 处。
完全展开预览
在函数式宏的使用处显示实参代入宏体后的结果
悬停于函数式宏调用时,会显示 #define 文本,以及代入调用实参后完全展开的结果预览。
命令行宏
悬停于通过 -D 定义的宏时,会显示合成的 #define
对于在命令行中定义的宏(-DFROM_CLI=7),悬停卡片会先显示合成的 #define FROM_CLI 7,再显示其展开结果。
实参中的嵌套宏
作为实参嵌套的宏只显示定义,不显示展开预览
展开预览从外层调用开始,因此悬停于实参中的内层宏名称时,只显示其定义,不显示展开预览。
在定义前使用
在定义前使用的宏尚无悬停信息
在宏自身的 #define 之前的 #if 中使用该宏名称时,没有悬停信息;在定义后使用时,悬停功能正常。
Preamble 中的 #define
文件开头的宏定义没有悬停卡片
首个声明之前、文件开头连续指令中的 #define 没有悬停卡片,而声明之后的宏定义有。
特殊悬停目标
类型悬停中的成员
悬停于枚举或结构体类型时,会列出其成员
卡片显示类型名称(对于结构体,还会显示其布局),但不展开成员列表,类型体显示为 {}。
typedef 的底层结构体
悬停于别名时,会展开其所指类型的定义
卡片将别名解析为其底层类型名称,但不展开该结构体的定义或成员列表。
关键字文档
语言关键字尚无文档悬停信息
悬停于 const 或 virtual 等关键字时,不会显示卡片。
属性文档
悬停于属性时,会显示其说明
无论是 GNU __attribute__ 写法还是 C++ [[...]] 属性,卡片都会显示属性自身的文档。
包含指令悬停
悬停于 #include 时,会显示解析后的头文件路径
卡片将引号中的头文件解析为磁盘上对应的文件。
this 表达式
悬停于 this 时,会显示其指向的类类型
在普通类和类模板中均可使用。
预定义标识符
悬停于 __func__ 时,会显示当前函数名
在具体函数中可以解析出其值;在模板中,只能得知其近似类型。
无意义的 Token 不显示悬停信息
内置关键字和空的主体不显示卡片
悬停于内置类型关键字或空的主体内部时,完全不会显示卡片,因此编辑器不会显示任何内容,避免产生干扰。(数值和布尔字面量目前也没有卡片,但这是已记录的功能缺失,参见数值字面量条目,并不保证今后也如此。)
GTK-Doc 和 kernel-doc
GObject Introspection 注解尚未显示在悬停卡片中
GTK-Doc 和 kernel-doc 的注释语法以及 GObject Introspection 注解尚未解析并显示在悬停卡片中。
Doxygen 中的 LaTeX 数学公式
Doxygen 行内公式不会渲染为数学公式
公式文本不会渲染为数学公式。
展示
Markdown 渲染
卡片以 Markdown 渲染,也可通过 parse_comment_as_markdown = false 以纯文本显示
模块相关
导入语句悬停
悬停于 import 时尚不显示导入模块的说明
悬停于 import 声明时,尚不显示导入模块的说明。
模块名悬停
悬停于模块名时显示定义该模块的接口单元
无论模块名位于 import 中还是模块声明中,卡片都会显示模块名及其接口单元所在的文件。
导出状态悬停
模块中声明的卡片会显示该声明是否被模块导出
已导出声明的卡片中,定义部分会带有 export,无论它是单独导出还是位于 export 块中;模块未导出、仅在内部使用的声明,以及导出类的成员,则不会带有。
悬停正确性
面对曾导致其他工具出错的输入时仍保持稳健。
MSVC 继承模型
MSVC 继承模型属性不会改变类类型的悬停信息
以 MSVC 为编译目标时,隐式继承属性不会出现在类类型或方法的悬停卡片中。
最令人烦恼的解析(most vexing parse)
直接初始化与函数声明的悬停卡片不同
直接初始化显示为变量,而最令人烦恼的解析形式显示为函数声明。
大数值无符号枚举常量
悬停于值为 0xFFFF...ULL 的枚举项时不会崩溃
卡片会完整显示无符号数值,不会溢出或出错。
使用默认实参的调用
悬停于省略默认实参的调用时不会崩溃
调用的悬停卡片会显示被调用函数的签名,包含默认实参。
被宏遮蔽的符号
函数式宏在调用处遮蔽同名函数
卡片会显示生效的宏及其展开结果,而非被遮蔽的函数。
