Почему конструктор копирования не разрешен по значению?

Возможный дубликат:
Почему конструктор копирования принимает свой параметр по ссылке в С++?
Может ли объект передаваться как значение конструктору копирования

Рассмотрим этот фрагмент кода:

class complex{
        private:
                double re, im;
        public:
                complex(double _re, double _im):re(_re),im(_im){}
                complex(complex c):re(c.re),im(c.im){}
};

При компиляции я получил сообщение об ошибке: invalid constructor; you probably meant ‘complex (const complex&)’

В книге C++ Programming Language написано, что:

Конструктор копирования определяет, какие средства копирования - включая копирование аргумента означает, что запись

complex: complex (complex c): re (c.re), im (c.im) {}//ошибка

- ошибка, потому что любой вызов включал бы бесконечную рекурсию.

Почему это приводит к бесконечной рекурсии? Это не имеет смысла.

Ответ 1

Передача по значению означает, что параметр скопирован в функцию. Это вызывает конструктор копирования.

Если ваш конструктор конструктора экземпляров имеет значение pass-by-value... Он будет называть себя... снова и снова...

Ответ 2

Передача по значению (а не по ссылке) означает, что нужно сделать копию. Таким образом, переход по значению в ваш конструктор копирования означает, что вам нужно сделать копию до того, как будет создан конструктор копирования, но для создания копии вам сначала нужно вызвать конструктор копирования.

Ответ 3

Когда функция передается с параметром, создается локальная переменная, соответствующая параметру, и копируется с аргументом, переданным вызову функции. Следовательно, когда вызывается функция, будет вызываться конструктор копирования функции, чтобы скопировать аргумент, переданный вызову, в созданную локальную переменную. Это приводит к бесконечному циклу.

Где, как при передаче ссылки на функцию, локальная переменная не создается в соответствии с параметром.