blob: a65727a1d43ba3526d910d16c9310ff4ee4641bc [file] [log] [blame]
// PR c++/51459
// { dg-do run { target c++11 } }
struct func {
virtual ~func() { }
virtual void operator()() const = 0;
virtual func* clone() const = 0;
};
template<typename T>
struct funcimpl : func {
explicit funcimpl(T t) : t(t) { }
void operator()() const { t(); }
func* clone() const { return new funcimpl(*this); }
T t;
};
struct function
{
func* p;
template<typename T>
function(T t) : p(new funcimpl<T>(t)) { }
~function() { delete p; }
function(const function& f) : p(f.p->clone()) { }
function& operator=(const function& ) = delete;
void operator()() const { (*p)(); }
};
template <typename F>
function animate(F f) { return [=]{ f(); }; }
int main()
{
function linear1 = []{};
function av(animate(linear1));
av();
}