1

I have a template List class, which overrides copy-constructor and the assignment operator:

template <typename T>
class List {
public:
    ...

    List() :
        _first(0),
        _last(0),
        _size(0) {
        std::cout << "[Constructor called]" << std::endl;
    }

    List(const List& rhs) :
        _first(0),
        _last(0),
        _size(0) {
        std::cout << "[Copy constructor called]" << std::endl;
        copyFrom(rhs);
    }

    ~List() {
        clear();
    }

    inline List& operator=(const List& rhs) {
        std::cout << "[Assignment operator called]" << std::endl;
        clear();
        copyFrom(rhs);
        return *this;
    }

    ...
}

Now, I am executing the following simple test code. I assumed that when calling the get() method there are copies of the List created - but this is not the case, only my normal constructor is called:

#include <iostream>
#include <string>

#include "List.hpp"

using namespace std;

List<string> get() {
       List<string> l;
       l.addBack("this");
       l.addBack("is");
       l.addBack("a");
       return l;
}

int main(int argc, char **argv) {
       List<string> listA = get();
       List<string> listB = get();

       listA.addBack("test");

       std::cout << std::endl;
       for (auto element : listA) {
             std::cout << element << std::endl;
       }

       std::cout << std::endl;
       for (auto element : listB) {
             std::cout << element << std::endl;
       }
}

And the output is:

[Constructor called]
[Constructor called]

this
is
a
test

this
is
a

How does this work, and why does it not call the copy constructor?

maxdev
  • 2,491
  • 1
  • 25
  • 50

0 Answers0