我有以下代码(为简单起见省略了部分代码)
头:
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;
我真的不知道以这种方式调用函数时静态行为是什么。
我希望函数createStream
只能调用一次(如果永远不调用operator()
,则永远不会被调用
我想知道我期待的行为是否会发生,如果这是一个可能的想法,或者我做了一些非常错误而没有注意到它。
对线程安全和异常安全有什么影响?
(考虑创建的流本身就是线程安全的,因为这里不关心std :: ostream的线程安全性)
答案 0 :(得分:1)
根据标准,在函数范围内定义的静态成员的初始化只发生一次。
static std::ostream os = createStream( *this ); // initialized only once
此外,如果您使用的是C ++ 11,则它是线程安全的。
请看看这些讨论:
1)thread safety of local static initialization in C++11。
2)Initialization of static variables。
如果您不使用C ++ 11,则operator()不是线程安全的
static std::ostream os = createStream( *this ); // if not C++11, this is not thread-safe and must be guarded.