ここからのコードを考えると:
class lazy_init
{
mutable std::once_flag flag;
mutable std::unique_ptr<expensive_data> data;
void do_init() const
{
data.reset(new expensive_data);
}
public:
expensive_data const& get_data() const
{
std::call_once(flag,&lazy_init::do_init,this);
return *data;
}
};
また、別の場所でも同じパターンのバリエーションをいくつか見ました。私の質問は、なぜこのコードが保存されていると見なされるのですか? なぜコンパイラはstd::call_once を呼び出す前にデータを読み取ることができず、間違ったデータになってしまうのでしょうか? 例えば
tmp = data.get();
std::call_once(flag,&lazy_init::do_init,this);
return *tmp;
つまり、それを妨げる障壁については何も見つけていません。