在Visual Studio 2017中查找移动构造/赋值运算符并添加noexcept
noexcept的移动操作 一、查找所有未标注noexcept的移动构造/赋值运算符
这里有几种实用的方法,适配不同规模的项目:
VS正则表达式精准查找:
打开VS的「查找和替换」对话框(快捷键Ctrl+Shift+F),切换到「使用正则表达式」模式,用以下正则分别匹配目标:- 移动构造:
(\w+)\s*\(\s*\1\s*&&\s*\)\s*(?!noexcept)
这个正则会匹配形如MyClass(MyClass&&)的构造函数,且后面没有紧跟noexcept关键字。如果你的构造函数带有基类初始化列表,可微调正则为(\w+)\s*\(\s*\1\s*&&\s*\)\s*(?!noexcept).*:来兼容这类场景。 - 移动赋值:
(\w+)\s*&\s*operator=\s*\(\s*\1\s*&&\s*\)\s*(?!noexcept)
同理,匹配形如MyClass& operator=(MyClass&&)的赋值运算符,且未标注noexcept。
- 移动构造:
VS自带代码分析工具:
启用C++ Core Guidelines的代码检查,其中规则**C.66(Move operations should be noexcept)**会直接标记未符合要求的移动操作。操作步骤:- 右键项目 → 属性 → 配置属性 → 代码分析 → 常规
- 将「启用代码分析」设为「是」,「规则集」选择「C++ Core Guidelines」
- 重新编译项目,不符合规则的移动操作会在「错误列表」中显示。
手动排查(适合小型项目):
遍历所有自定义类,检查是否存在移动构造/赋值运算符,同时确认是否带有noexcept。这种方法直接但效率低,仅推荐小项目使用。
二、开启编译器/代码分析警告提示
VS2017原生编译器没有专门针对「移动操作未标注noexcept」的警告,但可以通过代码分析规则触发提示:
启用C++ Core Guidelines相关警告:
规则C.66对应的警告ID是C26478,描述为「Don't use noexcept(false) on move operations, they should be noexcept (es.60)」。开启后,只要移动操作未标注noexcept(或标注了noexcept(false)),编译时就会给出警告。
若想单独启用该规则:在项目属性的「代码分析 → 规则集」中,点击「编辑规则集」,找到「C++ Core Guidelines → Move → C.66」并勾选即可。额外提示:
当标准库容器(比如std::vector)需要移动元素时,如果你的类移动操作未标注noexcept,容器会自动 fallback 到拷贝操作,但VS不会直接警告这个行为。不过通过上面的代码分析规则,你可以提前发现这类问题,避免潜在的性能损耗。
内容的提问来源于stack exchange,提问作者Coder_Dan

