以下是一个最小示例,有时会生成警卫,而有时却不会:
struct A {
inline A(int v = 0) {} // without ctors, guards are omitted
int m1() const {
return m;
}
private:
int m = 0;
};
//namespace { // without anon-ns guards are generated
template<typename T>
struct X {
static int foo() {
return m.m1();
}
inline static T m; // even as local-static and -fno-threadsafe-statics, guards are generated
};
//}
int main() {
return X<A>::foo();
}
总结:
m
成为foo()
中的静态局部,仍然会生成防护(使用-fno-threadsafe-statics
)因此,如何在类A
具有ctor且无法使用anon-ns的情况下生成防卫措施?
您可以将A
的构造函数声明为constexpr
,以便X<A>::m
被静态初始化。
如果变量需要动态初始化,则必须使用防护措施来防止多次初始化。