Ниже приведен минимальный пример, который иногда генерирует охранников, а иногда нет:
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() {
// static T m; // even as local-static and -fno-threadsafe-statics, guards are generated
return m.m1();
}
inline static T m; // comment this and uncomment above to try as local-static
};
//}
int main() {
return X<A>::foo();
}
Подводя итог:
- без ctor в классе A, охранники никогда не генерируются
- использование anaon-ns также предотвращает охрану
- делает статический член
m
статическим локальным в foo()
по-прежнему генерирует защиту (с -fno-threadsafe-statics
) (закомментируйте / раскомментируйте соответствующие строки в примере выше)
Итак, как предотвратить создание охранников в случае, если у класса A
есть ctor и использование anon-ns невозможно?