Это то, чего люди просто не могут ожидать. Предположим, у вас есть этот код:
int x = 5;
foobar(x);
Какое значение x
после вызова функции? Большинство людей ожидают, что оно все равно будет 5
, поскольку, за исключением неопределенного поведения, оно не может измениться при передаче по значению. В C даже нет передачи по ссылке, поэтому значение всегда будет 5
. Теперь в C ++ внезапно происходит передача по ссылке, и только из этого фрагмента кода вы не можете знать, изменится ли x
после вызова функции. Для этого вам нужно взглянуть на фактическую подпись foobar
.
Сам по себе он не «опасен», но при плохом использовании может привести к нечеткому и вводящему в заблуждение коду. Особенно, если у вас есть набор параметров, некоторые из которых не соответствуют параметрам, а некоторые нет, а некоторые имеют вводящие в заблуждение имена. В вашем примере имена параметров содержат out
, чтобы указать, что они являются выходными параметрами, и это хороший стиль, который уменьшает эту опасность.
Сравните это со следующим фрагментом отсюда , объясняющим проход по ссылке, как это происходит в C #:
void Method(ref int refArgument)
{
refArgument = refArgument + 44;
}
int number = 1;
Method(ref number);
Console.WriteLine(number);
// Output: 45
Здесь вы сразу видите, что оно передается по ссылке, потому что там написано ref number
.