是否存在clang-tidy检查,用于检测const成员函数返回非const引用?
检查const成员函数返回非const引用的场景(PIMPL/指针特例)
正常情况下,编译器会捕获const成员函数返回非const引用的问题,但当使用PIMPL模式或指针时,会出现编译器无法检测的漏洞:编译器仅保证指针本身是const(不能修改指针指向),但允许修改指针指向对象的内容,从而破坏了逻辑上的const语义。
问题示例代码
#include <cstdint> #include <iostream> #include <memory> #include <vector> struct PIMPL { int x = 0; }; struct Data { std::unique_ptr<PIMPL> m_pimpl = std::make_unique<PIMPL>(); // 语法上const合规,但逻辑上破坏了const语义 int& func() const { return m_pimpl->x; } int& func() { return m_pimpl->x; } }; int main(int argc, char* argv[]) { Data dat1; const Data dat2; // 合法操作 dat1.func() = 2; // 逻辑上不应该被允许,但编译器不报错 dat2.func() = 44; std::cout << dat1.func() << std::endl; std::cout << dat2.func() << std::endl; }
特殊场景说明
这种情况在少数边缘场景下是合法的(比如需要在const对象中保留可变字段),但即便物理上无需标记,也应该要求开发者在PIMPL结构体中显式将对应字段标记为mutable,以此明确代码意图,避免逻辑const被意外破坏。
现有工具的缺失
经过搜索查阅clang-tidy文档,未找到针对该场景的内置检查选项,这一点比较意外。
期望的检查规则
理想的检查工具应该满足以下条件:
- 目标函数是带有
const限定符的成员函数 - 函数返回值为引用类型
- 返回值未带有
const限定符 - 返回的成员(或指针指向的成员)未被标记为
mutable
内容的提问来源于stack exchange,提问作者Klypto
相关产品推荐
相关产品推荐

