ReSharper C++ 2023.2 最新变化

ReSharper C++ 2023.2 引入了 Safe Delete(安全删除)重构,让您可以从源代码安全移除符号。 对于现代 C++ 项目,已有多个新的 C++20 和 C++23 功能获得支持,包括 C++23 标准库模块。 新版本还提供了 ReSharper AI Assistant,专门帮助您处理编程任务。

下载

可免费试用 30 天

AI Assistant 受限访问

AI Assistant 不与 ReSharper 捆绑,必须单独安装。 目前,我们还推出了一个等候名单来管理使用 AI Assistant 功能的请求。

有关 AI Assistant 的更多信息以及如何通过 Toolbox App 或 dotUltimate 安装程序进行安装的说明,请参阅我们的网络帮助

ReSharper C++ 2023.2 引入了 ReSharper AI Assistant – 这种 AI 驱动聊天工具专门用于回答编程问题,帮助您进行故障排除、重构、记录和其他开发工作流。

ReSharper 的 AI Assistant 会考虑项目中使用的语言和技术。 这种上下文感知可以立即调整其响应,节省您的时间和精力。

您可以随意在查询中包含部分源代码。 ReSharper 将检测您发送或粘贴到聊天中的代码并将其正确格式化,AI 模型将解释代码背后的逻辑并帮助您重构、查找问题或记录。

C++23 支持

if consteval 语句是 C++23 中新增的常量求值功能,它进一步发展了 C++20 constevalstd::is_constant_evaluated() 的思想。 如果 if consteval 语句的求值发生在常量求值期间,则执行以下复合语句。 否则,执行 else 分支。

ReSharper C++ 引入了对 if consteval 的支持并带来了一组相关检查:

  • consteval if 始终为常量。
  • std::is_constant_evaluated 始终求值为常量。
  • if 可被替换为 if consteval

ReSharper C++ 现在支持 C++23 标准库中引入的命名模块 stdstd.compat。 在 Visual Studio 17.6 或更高版本上,您现在可以使用 import stdimport std.compat 导入整个标准库,而不是使用预编译头或包含特定的标准库头。

在 C++23 之前,所有运算符都必须是非 static 成员函数。 不过,调用运算符通常与无成员函数对象一起使用,在这种情况下允许运算符为 static 可以产生更高效的代码。 C++23 允许 operator()operator[] 都为 static。

C++20 支持

我们一直在完善 C++20 模块支持,修正了使用模块的实际项目中的各种角落问题。 在内部处理模块时,ReSharper C++ 现在实现了舍弃 decl 不可达声明的选项,显著提高了在全局模块片段中包含大量头的模块的性能。

此外,我们还实现了一些更改,更好地支持 CMake 项目中的模块。 ReSharper C++ 现在将 .cppm 文件识别为模块接口,并包括对位于项目文件夹外部的模块的实验性支持。

C++20 新增的 [[no_unique_address]] 特性表明类的非 static 数据成员不需要唯一地址,允许编译器以更有效的方式布局类的成员。 现在,ReSharper C++ 在计算对象的大小时会考虑 [[no_unique_address]]

ReSharper C++ 2023.2 还实现了最近接受的 C++20 缺陷报告,该报告允许使用 UTF-8 字符串字面量初始化 charunsigned char 字符数组。

Safe Delete(安全删除)重构

ReSharper C++ 引入了 Safe Delete(安全删除)重构,让您可以从源代码安全移除符号。 这种重构适用于类、函数、变量、枚举器、命名空间,甚至概念。

要调用重构,首先将文本光标置于要删除的符号上,然后按 Alt+Del,或从 Refactor This(重构此)菜单选择 Safe Delete(安全删除)。

删除符号之前,ReSharper C++ 会搜索其用法并让您预览源代码更改,帮助您确定移除没有错误。 尝试删除类或命名空间等复杂实体时,ReSharper C++ 将递归检查其所有成员的用法。

Unreal Engine

这个版本为蓝图索引编制带来了性能改进。 当您第一次打开项目时,ReSharper C++ 将为所有蓝图资源编制索引,驱动 Find Usages(查找用法)等功能,并直接在文本编辑器中显示序列化数据的值。

先前,ReSharper C++ 会以与 C++ 代码相同的优先级对这些资源编制索引,导致项目需要较长准备时间才能开始工作。 ReSharper C++ 2023.2 将在对 C++ 代码编制索引后在后台对资源编制索引,不会干扰您的工作。

我们使用标准赋值语义改进了包装器类型的智能补全。 例如,赋值给 TEnumAsByte 类型的变量时,补全将从底层枚举类型建议枚举器。

对于 Unreal Engine 5.1 项目,我们引入了对 UE_INLINE_GENERATED_CPP_BY_NAME 宏的支持,可将生成的文件内联到模块中以缩短编译时间。

编码辅助

通过改进依赖代码的补全,当类型受概念或特征限制时,您将获得补全条目。 ReSharper C++ 现在会考虑标准 std::is_same/std::is_base_of 类型特征、其 _v 值别名、相应的 std::same_as/std::derived_from 概念,以及 Unreal Engine TIsSame 特征。

为了提供更有用的代码补全建议,ReSharper C++ 现在还从 requires 子句、if constexpr 和 SFINAE 中提取类型和值要求。

两个新增的互补上下文操作可帮助您将模板形参约束移至 requires 子句,以及将 requires 子句转换为模板形参约束。

如果您有递归调用,ReSharper C++ 将在装订区域中标记,使其更加明显。

代码补全列表现在会筛选掉保留的标识符,并仅在 _ 之后建议。 因此,如果没有必要,您就无需滚动浏览标准库中的建议。

ReSharper C++ 2023.1 在 Quick Documentation(快速文档)弹出窗口和悬停工具提示中为宏替换引入了适当的高亮显示和格式化。 在 2023.2 版本中,这些改进也适用于代码补全中的宏定义和 Parameter Info(形参信息)。

我们改进了求值引擎,以支持 constexpr 数组的聚合初始化。

我们改进了与 GCC 和 Clang 编译器以及 libc++/libstdc++ 标准库的兼容性。 这包括对 __integer_pack__is_convertible/__is_nothrow_convertible 等更多内置函数的支持,以及对先前支持的内置函数的更新。

使用 Doxygen param 命令的 [in][in,out][out] 特性指定形参方向时,工具提示现在会从您的注释中获取它们。

代码分析

ReSharper C++ 2023.2 添加了一项新检查,可以用于检测冗余的取消引用和寻址运算符。 它为您提供了多种快速修复,帮助简化成员访问并移除冗余运算符。

另一项新检查可以高亮显示与相应默认模板实参匹配且可以省略的冗余模板实参。

一项新的兼容性检查可以警告您注意没有底层类型的 C 样式枚举的前向声明,这被 C++ 标准所禁止,但被 MSVC 接受,可能导致代码不可移植。

ReSharper C++ 现在根据严重级别高亮显示 #error#warning 诊断预处理程序指令。

捆绑的 clang-tidy 二进制文件也已更新到 Clang 16,提供了新的检查和修正。

MSVC 可以使用传统预处理程序或符合标准的新预处理程序,具体取决于 /Zc:preprocessor 编译器实参的值。 ReSharper C++ 现在从项目属性读取此实参的值,并相应地调整内置预处理程序的行为。

导航

ReSharper C++ 2023.2 对 Go to declaration(转到声明)做出多项改进,使代码导航更加一致、直观,无需额外步骤:

  • 在构造函数调用中调用类名时,Go to declaration(转到声明)现在会导航到构造函数而不是包含的类。
  • Go to declaration(转到声明)现在会导航到第一个 typedef 或类型别名声明,而不是显示所有声明的菜单。
  • 在模块名称上使用 Go to declaration(转到声明)会在同一模块的接口和实现单元之间跳转。
  • #include 路径中的文件夹上使用 Go to declaration(转到声明)会打开文件夹。

此外,Type of symbol(符号类型)现在可用于非声明符符号。 它的工作方式类似于 Go to declaration(转到声明)。

格式化和输入辅助

生成文档注释时,ReSharper C++ 现在将根据编辑器中的注释样式调整文档模板。 对于 /**,输入辅助将生成 /** */ 样式的注释,对于 ///,注释将为 /// 样式。

这个版本对位字段成员的格式化带来了多项改进。 在列中对齐初始值设定项和声明名称的选项现在支持位字段。 还有两个新的格式化设置,用于位字段声明中冒号前后的空格以及列中位字段大小的对齐。

新的输入辅助选项可让您关闭文档注释的生成,避免与 Visual Studio 的内置生成器冲突(ReSharper | Options | Environment | Editor | Behavior | C++, C, HLSL | Generate documentation comments(ReSharper | 选项 | 环境 | 编辑器 | 行为 | C++、C、HLSL | 生成文档注释))。

我们还更新了捆绑的 clang-format 二进制文件并修正了 clang-format 引擎,防止其移除文件末尾的换行符。

查看 ReSharper 最新变化,了解此版本中引入的其他变更。 例如,ReSharper 引入了预测调试器,可以预见执行程序时触发的所有可能状态,无需实际执行。

下载

可免费试用 30 天