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.
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>