2

我有以下代码(为简单起见,省略了部分代码)

标题:

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 的线程安全不是我关心的问题)

4

1 回答 1

1

根据标准,在函数范围内定义的静态成员的初始化只发生一次。

    static std::ostream os = createStream( *this ); // initialized only once

此外,如果您使用 C++11,它是线程安全的。

请看一下这些讨论:

1) C++11 中局部静态初始化的线程安全

2)静态变量的初始化

如果您不使用 C++11,则 operator() 不是线程安全的

 static std::ostream os = createStream( *this ); // if not C++11, this is not thread-safe and must be guarded.
于 2013-04-10T03:15:01.553 回答