То, что вы делаете вызов метода, здесь не имеет значения. Инициализация ссылочного параметра во время вызова функции ничем не отличается от инициализации автономной ссылки и определяется теми же правилами.
Правила инициализации ссылок немного сложны, но в нижней строке указано, что если инициализатор является lvalue (аргумент в вызове метода в вашем случае), а тип ссылки такой же, как тип инициализатор (т. е. тип параметра совпадает с типом аргумента), тогда ссылка будет связана напрямую. То есть копия не создается.
Object a; // class type
Object &r = a; // no copying
const Object &cr = a; // no copying
Если эти требования не выполняются (например, если инициализатор является rvalue, например), то все зависит. В некоторых случаях копирование может и произойдет. Например
const Object &tr = Object();
может интерпретироваться компилятором, как
const Object &tr = Object(Object(Object(Object())));
с зависящим от реализации конечного числа копирований. Конечно, по соображениям эффективности компиляторы обычно стараются не создавать ненужные копии, даже если им разрешено копировать.
Классический пример, который часто мешает спор о действительности копировального поведения компилятора ссылка инициализация в выражениях, как в следующем одном
Object a;
const Object &r = <some condition> ? a : Object();
Люди, знакомые с C++ ссылочной семантики бы понять, что такие выражения, как вышесказанное, вероятно, является обоснованием стандартного разрешения на выполнение избыточного копирования во время инициализации ссылки.
Ваша терминология не должна предполагать, что 'anotherObject' создает копию себя .. объект, который создается после того, как новый будет создание копии' anotherObject'. –
@ Хассан: Не изменяйте значение вопроса, не спрашивая OP. Это важное различие. '& anotherObject' является указателем, а не ссылкой. –
«невозможно сказать», что 'new object (& anotherObject)' будет создавать копию другого объекта неявно (что и предлагает формулировка). Для того чтобы этот оператор сохранялся, синтаксис нуждается в настройке. –