#include <iostream>
#include <mutex>
class Foo
{
public:
Foo() : _i(NULL) {}
int get()
{
std::call_once(_flag,
[&]()
{
std::cout << "Setting _i\n";
_i = new int(5);
});
return *_i;
}
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
private:
std::once_flag _flag;
int* _i;
};
int main()
{
Foo f;
std::cout << f.get() << "\n";
std::cout << f.get() << "\n";
std::cout << f.get() << "\n";
std::cout << f.get() << "\n";
std::cout << f.get() << "\n";
std::cout << f.get() << "\n";
std::cout << f.get() << "\n";
std::cout << f.get() << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bXV0ZXg+CgpjbGFzcyBGb28KewpwdWJsaWM6CiAgICBGb28oKSA6IF9pKE5VTEwpIHt9CiAgICBpbnQgZ2V0KCkKICAgIHsKICAgICAgICBzdGQ6OmNhbGxfb25jZShfZmxhZywKICAgICAgICAgICAgICAgICAgICAgICBbJl0oKQogICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJTZXR0aW5nIF9pXG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICBfaSA9IG5ldyBpbnQoNSk7CiAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuICpfaTsKICAgIH0KICAgIEZvbyhjb25zdCBGb28mKSA9IGRlbGV0ZTsKICAgIEZvbyYgb3BlcmF0b3I9KGNvbnN0IEZvbyYpID0gZGVsZXRlOwpwcml2YXRlOgogICAgc3RkOjpvbmNlX2ZsYWcgX2ZsYWc7CiAgICBpbnQqIF9pOwp9OwoKaW50IG1haW4oKQp7CiAgICBGb28gZjsKCiAgICBzdGQ6OmNvdXQgPDwgZi5nZXQoKSA8PCAiXG4iOwogICAgc3RkOjpjb3V0IDw8IGYuZ2V0KCkgPDwgIlxuIjsKICAgIHN0ZDo6Y291dCA8PCBmLmdldCgpIDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgZi5nZXQoKSA8PCAiXG4iOwogICAgc3RkOjpjb3V0IDw8IGYuZ2V0KCkgPDwgIlxuIjsKICAgIHN0ZDo6Y291dCA8PCBmLmdldCgpIDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgZi5nZXQoKSA8PCAiXG4iOwogICAgc3RkOjpjb3V0IDw8IGYuZ2V0KCkgPDwgIlxuIjsKICAgIHJldHVybiAwOwp9Cg==