2014-09-14 2 views
0

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

Когда я попробовал, мой компилятор просто дал мне сообщение, в котором говорилось: «Вы, вероятно, имели в виду Foo(const Foo&)».

В чем причина этого?

+1

На самом деле, потому что если вы передаете значение компилятором значения, необходимо сделать копию varibale ypuir, поэтому вызовите конструктор копирования. В результате вам придется сделать копию, чтобы сделать копию, но вам нужно сделать копию, чтобы сделать копию и так далее. – Lol4t0

+0

У нас есть аналогичный вопрос SO здесь http://stackoverflow.com/questions/13413419/parametized-constructor-not-an-copy-one – Athiruban

+3

@ 40two Главным образом, чтобы избежать бесконечной рекурсии – juanchopanza

ответ

7

Поскольку для передачи по значению вначале требуется конструктор копирования.

Таким образом, чтобы избежать бесконечной рекурсии, конструктор pass by reference должен быть определен перед версией pass by value, если мы действительно хотим иметь пропуск по значению один. Поскольку не имеет смысла иметь конструктор копирования pass by value, стандарт запрещает его.

+0

, так что .. это не требовало бы значения (еще раз) ? –

+0

@prodicus Действительно. Чтобы избежать этого, сначала нужно определить другую версию. – WiSaGaN

+0

У вас не может быть «pass by value version» вообще. –

5

Вы просто не могут передать его по значению - §12.8 [class.copy]/p6 стандарта явно запрещает это:

Объявление конструктора для класса X плохо сформированным если его первый параметр имеет тип (необязательно cv-квалифицированный) X и либо других параметров нет, либо все остальные параметры имеют аргументы по умолчанию. Шаблон функции-члена никогда не создается в , чтобы создать такую ​​подпись конструктора.

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

Смежные вопросы