Вызов конструкторов и деструктора при использовании std::function совместно с std::bind

Имеется код:

#include <functional>
#include <iostream>

struct Foo {
  Foo(int num) : num_(num) {std::cout << "Hello World" << std::endl;}
  ~Foo() {std::cout << "Goodby World" << std::endl;}
    void print_add(int i) const { std::cout << num_+i << '\n'; }
    int num_;
};

int main()
{
  using std::placeholders::_1;
  std::function<void(int)> f_add_display59 = std::bind( &Foo::print_add, Foo(75), _1 );
}

При его исполнении в консоль пишется один раз Hello World и три раза Goodby World. Почему один раз вызывается конструктор и, затем, деструктор понятно: так как вторым аргументом std::bind идет временный объект, но почему происходит вызов еще двух деструкторов? Где, тогда, два конструктора, если объекты били созданы?


Ответы (1 шт):

Автор решения: Harry

Запустите этот код и получите ответ :)

#include <functional>
#include <iostream>

struct Foo {
  Foo(int num) : num_(num) {std::cout << "Hello World" << std::endl;}
  Foo(const Foo& f) : num_(f.num_) {std::cout << "Hello World copy" << std::endl;}
  ~Foo() {std::cout << "Goodby World" << std::endl;}
    void print_add(int i) const { std::cout << num_+i << '\n'; }
    int num_;
};

int main()
{
  using std::placeholders::_1;
  std::function<void(int)> f_add_display59 = std::bind( &Foo::print_add, Foo(75), _1 );

}

https://ideone.com/mEyFeI

→ Ссылка