On Thu, Jul 12, 2018 at 12:41 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > Following on from: > > https://gcc.gnu.org/ml/gcc-patches/2018-07/msg00603.html > > this patch is an RFC to mention references in the C++ coding conventions. > It allows const references anywhere they're useful but only allows > non-constant references in contexts that conform to a standard > interface, or when returning a reference to something that is known > to be nonnull. > > It looks like there are still very few public functions that use > non-constant references. If the patch is OK, I'll volunteer to > change them.
OK. Richard. > Thanks, > Richard > > > Index: htdocs/codingconventions.html > =================================================================== > RCS file: /cvs/gcc/wwwdocs/htdocs/codingconventions.html,v > retrieving revision 1.81 > diff -u -p -r1.81 codingconventions.html > --- htdocs/codingconventions.html 2 Jun 2018 21:16:09 -0000 1.81 > +++ htdocs/codingconventions.html 12 Jul 2018 10:05:12 -0000 > @@ -57,6 +57,7 @@ the conventions separately from any othe > <li><a href="#Over_Func">Overloading Functions</a></li> > <li><a href="#Over_Oper">Overloading Operators</a></li> > <li><a href="#Default">Default Arguments</a></li> > + <li><a href="#NonConst_Ref">References</a></li> > <li><a href="#Cxx_Inlining">Inlining Functions</a></li> > <li><a href="#Template_Use">Templates</a></li> > <li><a href="#Namespace_Use">Namespaces</a></li> > @@ -996,6 +997,44 @@ Virtual functions should not have defaul > </p> > > > +<h4><a name="NonConst_Ref">References</a></h4> > + > +<p> > +Const references can be used freely. They are a useful way of reducing > +unnecessary copying or avoiding an impossible copy. > +</p> > + > +<p> > +Only use non-constant references in the following situations: > +</p> > + > +<ul> > +<li>when they are necessary to conform to a standard interface, such as > +the first argument to a non-member <code>operator+=</code></li> > +<li>in a return value, when providing access to something that is known > +to be nonnull</li> > +</ul> > + > +<p> > +In other situations the convention is to use pointers instead. > +</p> > + > +<blockquote> > +<pre><code>HOST_WIDE_INT do_arith (..., bool *overflow); // OK > +HOST_WIDE_INT do_arith (..., bool &overflow); // Please avoid > + > +int *elt = &array[i]; // OK > +int &elt = array[i]; // Please avoid > +</code></pre></blockquote> > + > +<p> > +There are two main reasons for this restriction. The first is to avoid > +an inconsistency with the large body of older (pre-C++) code that uses > +the pointer convention. The second is to maintain a visual distinction > +between the arguments that a function does modify and the arguments that > +it doesn't. > +</p> > + > <h4><a name="Cxx_Inlining">Inlining Functions</a></h4> > > <p>