【发布时间】:2021-02-17 04:32:10
【问题描述】:
我的类中有一个私有静态向量,它保存指向从它创建的所有对象的指针。这是必要的,因为每个对象都需要访问所有其他对象的信息才能执行一些计算:
// Header file:
class Example {
public:
Example();
private:
static std::vector<const Example*> examples_;
};
// Cpp file:
std::vector<const Example *> Example::examples_ = {};
Example::Example() {
// intialization
examples_.emplace_back(this);
}
void Example::DoCalc() {
for (auto example : examples_) {
// do stuff
}
}
clang-tidy 指出我违反了 C++ 核心准则,即:“变量 'examples_' 是非常量且全局可访问的,请考虑将其设为 const (cppcoreguidelines-avoid-non-const-global-variables)”。
就我个人而言,我没有看到我的代码与核心指南中的示例代码有相似之处,尤其是因为变量位于类内部并且是私有的。实现此功能的“正确”方式是什么?如果可以避免,我不想从 clang-tidy 禁用此检查。
【问题讨论】:
-
可能和SOIF有关。如果你有 C++17,定义静态成员 inline,看看警告是否消失。
-
我从事 C++ 工作已经很长时间了。我从来没有想过可变静态类成员存在根本性的问题。该文件提到的唯一潜在问题是静态初始化命令失败。这是事实,但不是否认所有静态类成员的理由。
-
我想知道如果你在课堂上使用
static inline std::vector<const Example*> examples_;然后从cpp 文件中删除std::vector<Example *> Example::examples_ = {};会发生什么。您仍然收到警告吗? -
@SamVarshavchik 和数据竞争,以及您隐藏依赖项的事实
-
使用 gcc,这不会编译,因为您在这里省略了
const:std::vector<const Example *> Example::examples_ = {};。但我想这只是一个错字,而不是你真正的问题。
标签: c++ static-members clang-tidy cpp-core-guidelines