Obiekt funkcyjny

0
struct MyStruct
{
    int parametr;
    MyStruct(int p) : parametr(p) { std::cout << "Konstruktor"; };
    ~MyStruct() { std::cout << "Destrukor"; }
    bool operator()(int r) { return r > parametr; };
};

int main()
{
    std::vector<int> vec(10);
    std::iota(vec.begin(), vec.end(), 0);
    int ile = std::count_if(vec.begin(), vec.end(), MyStruct(5));
    std::cout << ile;
}

Dlaczego po wykonaniu programu aż dwa razy wypisuje "Destruktor"?

2

Niestety, algorytmy biblioteki standardowej zakładają, że obiekty funkcyjne im przekazywane są lekkie i ich kopiowanie jest właściwie darmowe, więc mogą to robić.

0
struct MyStruct
{
    int parametr;
    MyStruct(int p) : parametr(p) { std::cout << "Konstruktor"; };
    MyStruct(const MyStruct& wz) : parametr(wz.parametr) { std::cout << "KonstruktorKopiujacy"; };
    ~MyStruct() { std::cout << "Destruktor"; }
    bool operator()(int r) { return r > parametr; };
};

Więc dlaczego gdy zdefiniuję własny konstruktor kopiujący, to nie wykonuje się jego ciało?

3

U mnie się wykonuje. https://wandbox.org/permlink/HEccmF3xfZ4muuqR

Konstruktor
KonstruktorKopiujacy
KonstruktorKopiujacy
KonstruktorKopiujacy
Destrukor
Destrukor
Destrukor
Destrukor

Przy czym, jeśli kompilujesz z optymalizacją to może gdzieś masz RVO albo NRVO, gdzie nawet przed C++17 kompilator mógł uznać, że konstruktor kopiujący nie ma efektów ubocznych i go usunąć (ale wtedy nie powinno być też wywołania destruktora dla tej kopii)

PS: ```cpp i masz kolorowanie składni.

1 użytkowników online, w tym zalogowanych: 0, gości: 1