当使用-Weverything
或Wglobal-constructors
时,Clang会对静态对象的构造函数进行警告。
warning: declaration requires a global constructor
[-Wglobal-constructors]
A A::my_A; // triggers said warning
^~~~
为什么这个警告很重要,应该如何处理?简单的示例代码:
class A {
// ...
static A my_A;
A();
};
A A::my_A; // triggers said warning
struct A { static A s; }; A A::s; int main() { A a; a.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s; }
- 这几乎像一个 C++ 玩笑。为什么会有人想在一个对象内部放置静态对象? - user93353static
对象是属于类而不是类的个别对象的一部分,即不在其内部。但是,您可以像访问对象的成员一样访问它:A::s
和A().s
引用同一个(唯一的)对象(无论其是否为相同类型的A
)。具有相同类型的static
成员是实现单例模式的一种方式。 - Walter