#include <iostream>
#include <deque>
#include <algorithm>
#include <utility>
#include <memory>
using namespace std;
 
deque<bool> pool;
 
class ExpressionTemp;
class Scalar
{
    bool *alive;
 
    friend class ExpressionTemp;
 
    Scalar(const Scalar&);
    Scalar &operator=(const Scalar&);
    Scalar &operator=(Scalar&&);
public:
    Scalar()
    {
        pool.push_back(true);
        alive=&pool.back();
    }
    Scalar(Scalar &&rhs)
        : alive(0)
    {
        swap(alive,rhs.alive);
    }
    ~Scalar()
    {
        if(alive)
            (*alive)=false;
    }
};
class ExpressionTemp
{
    bool *operand_alive;
public:
    ExpressionTemp(const Scalar &s)
        : operand_alive(s.alive)
    {
    }
    void do_job()
    {
      if(*operand_alive)
          cout << "captured operand is alive" << endl;
      else
          cout << "captured operand is DEAD!" << endl;
    }
};
 
ExpressionTemp expression(const Scalar &s)
{
    return {s};
}
int main()
{
    {
        expression(Scalar()).do_job(); // OK
    }
    {
        Scalar lv;
        auto &&rvref=expression(lv);
        rvref.do_job(); // OK, lv is still alive
    }
    {
        auto &&rvref=expression(Scalar());
        rvref.do_job(); // referencing to dead temporary
    }
    return 0;
}
 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZGVxdWU+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZGVxdWU8Ym9vbD4gcG9vbDsKCmNsYXNzIEV4cHJlc3Npb25UZW1wOwpjbGFzcyBTY2FsYXIKewogICAgYm9vbCAqYWxpdmU7CiAgICAgICAgCiAgICBmcmllbmQgY2xhc3MgRXhwcmVzc2lvblRlbXA7CgogICAgU2NhbGFyKGNvbnN0IFNjYWxhciYpOwogICAgU2NhbGFyICZvcGVyYXRvcj0oY29uc3QgU2NhbGFyJik7CiAgICBTY2FsYXIgJm9wZXJhdG9yPShTY2FsYXImJik7CnB1YmxpYzoKICAgIFNjYWxhcigpCiAgICB7CiAgICAgICAgcG9vbC5wdXNoX2JhY2sodHJ1ZSk7CiAgICAgICAgYWxpdmU9JnBvb2wuYmFjaygpOwogICAgfQogICAgU2NhbGFyKFNjYWxhciAmJnJocykKICAgICAgICA6IGFsaXZlKDApCiAgICB7CiAgICAgICAgc3dhcChhbGl2ZSxyaHMuYWxpdmUpOwogICAgfQogICAgflNjYWxhcigpCiAgICB7CiAgICAgICAgaWYoYWxpdmUpCiAgICAgICAgICAgICgqYWxpdmUpPWZhbHNlOwogICAgfQp9OwpjbGFzcyBFeHByZXNzaW9uVGVtcAp7CiAgICBib29sICpvcGVyYW5kX2FsaXZlOwpwdWJsaWM6CiAgICBFeHByZXNzaW9uVGVtcChjb25zdCBTY2FsYXIgJnMpCiAgICAgICAgOiBvcGVyYW5kX2FsaXZlKHMuYWxpdmUpCiAgICB7CiAgICB9CiAgICB2b2lkIGRvX2pvYigpCiAgICB7CiAgICAgIGlmKCpvcGVyYW5kX2FsaXZlKQogICAgICAgICAgY291dCA8PCAiY2FwdHVyZWQgb3BlcmFuZCBpcyBhbGl2ZSIgPDwgZW5kbDsKICAgICAgZWxzZQogICAgICAgICAgY291dCA8PCAiY2FwdHVyZWQgb3BlcmFuZCBpcyBERUFEISIgPDwgZW5kbDsKICAgIH0KfTsKCkV4cHJlc3Npb25UZW1wIGV4cHJlc3Npb24oY29uc3QgU2NhbGFyICZzKQp7CiAgICByZXR1cm4ge3N9Owp9CmludCBtYWluKCkKewogICAgewogICAgICAgIGV4cHJlc3Npb24oU2NhbGFyKCkpLmRvX2pvYigpOyAvLyBPSwogICAgfQogICAgewogICAgICAgIFNjYWxhciBsdjsKICAgICAgICBhdXRvICYmcnZyZWY9ZXhwcmVzc2lvbihsdik7CiAgICAgICAgcnZyZWYuZG9fam9iKCk7IC8vIE9LLCBsdiBpcyBzdGlsbCBhbGl2ZQogICAgfQogICAgewogICAgICAgIGF1dG8gJiZydnJlZj1leHByZXNzaW9uKFNjYWxhcigpKTsKICAgICAgICBydnJlZi5kb19qb2IoKTsgLy8gcmVmZXJlbmNpbmcgdG8gZGVhZCB0ZW1wb3JhcnkKICAgIH0KICAgIHJldHVybiAwOwp9Cg==