Зачем нужна ссылка в конструкторе копирования?

Допустим имеем следующий класс

class String
{
 private:
    char* buf;
    int size;
 public:
    String(const char* str)
    {
       // code
    }

    String(const String& str)  // Почему здесь ссылка?
    {
        char* buf = new char[str.size + 1];
        memcpy(buf, str.buf, str.size + 1);
    }
}

Учитывая что аргумент String str мы не собираемся менять, зачем передавать его по ссылке?


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

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

Чтобы передать класс в функцию (или в конструктор) по значению (а не по ссылке), должен быть вызван какой-нибудь конструктор.

Если вы замените ссылку на String str и попробуете сделать String a("x"); String b(a);, то для b параметр конструктора str должен быть сконструирован. А каким конструктором он будет конструироваться? Тем же самым? Понятно, в чем проблема?

Поэтому язык запрещает создавать конструкторы вида T(T).

→ Ссылка