У меня есть следующий код (часть его была опущена для простоты)
заголовок:
class DbgModuleMarker
{
public:
DbgModuleMarker( std::string name );
static std::ostream createStream( const DbgModuleMarker& marker );
std::ostream& operator()() const;
};
extern DbgModuleMarker PHYSICS;
источник:
std::ostream& DbgModuleMarker::operator()() const
{
static std::ostream os = createStream( *this );
return os;
}
цель этого кода состоит в том, чтобы operator()
использоваться следующим образом
debug_modules::PHYSICS() << "Foo" << endl;
Я действительно понятия не имею, как ведет себя static, когда функция вызывается таким образом.
Я бы ожидал функцию createStream
будет вызван только один раз (или никогда не будет вызван, если operator()
никогда не называется
Я хотел бы знать, произойдет ли ожидаемое поведение, и будет ли это хорошей идеей, или я делаю что-то очень неправильно, не замечая этого.
Какое влияние на безопасность потоков и исключений безопасности?
(подумайте, что созданный поток сам по себе будет потокобезопасным, потому что безопасность потока std :: ostream здесь не моя задача)
Согласно стандарту, инициализация статических членов, определенных в области действия функции, происходит только один раз.
static std::ostream os = createStream( *this ); // initialized only once
Кроме того, это потокобезопасно, если вы используете C ++ 11.
Просьба взглянуть на эти обсуждения:
1) потокобезопасность локальной статической инициализации в C ++ 11.
2) Инициализация статических переменных.
Если вы не используете C ++ 11, то оператор () не является потокобезопасным
static std::ostream os = createStream( *this ); // if not C++11, this is not thread-safe and must be guarded.
Других решений пока нет …