Хочу.
То, что стрелочная нотация читается хуже - справедливо, хороший аргумент. Однако, при чтении чужого кода все же хотелось бы знать, что будет изменяться , без необходимости ходить в каждую подпрограмму. Хороший пример представляет, как ни странно, Ассемблер.
mov ax, bx
Смогли бы Вы, впервые взглянув на этот код, сказать, какой из параметров этой мнемоники входной, а какой выходной(предположим, что Вы ассемблера совершенно не знаете)? Скажу честно - 2 курса было с его использованием, а все равно толком не помню, какой из них кто
Переменные, переданные в С++ подобным образом, создают такой же точно эффект. К примеру, посмотрим на copy_value(a, b). Сказать, что и куда копируется без чтения функции попросту невозможно. Изменив сигнатуру на void copy_value(const val& x, val* y) , мы это обозначим явным образом: кроме как copy(a, &b), написать никак нельзя.
Остается добавить только цитату из общепринятого во многих сообществах программистов [Google C++ Style Guide][1]:
Reference Arguments
All parameters passed by reference must be labeled const.
Definition
In C, if a function needs to modify a variable, the parameter must use
a pointer, eg *int foo(int pval). In C++, the function can
alternatively declare a reference parameter: int foo(int &val).
Pros
Defining a parameter as reference avoids ugly code like (*pval)++.
Necessary for some applications like copy constructors. Makes it
clear, unlike with pointers, that a null pointer is not a possible
value.
Cons
References can be confusing, as they have value syntax but pointer
semantics.
Desicion
Within function parameter lists all references must be const:
void Foo(const string &in, string *out);
>In fact it is a very strong
> convention in Google code that input arguments are values or const
> references while output arguments are pointers. Input parameters may
> be const pointers, but we never allow non-const reference parameters
> except when required by convention, e.g., swap().
>
> **However, there are some instances where using const T* is preferable to const T& for input parameters. For example:**
>
> You want to pass in a null pointer. The function saves a pointer or
> reference to the input. Remember that most of the time input
> parameters are going to be specified as const T&. Using const T*
> instead communicates to the reader that the input is somehow treated
> differently. So if you choose const T* rather than const T&, do so for
> a concrete reason; otherwise it will likely confuse readers by making
> them look for an explanation that doesn't exist.
[1]: https://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Reference_Arguments