C++11: Beware unnecessary copies with auto

It's easy to copy unintentionally when using 'auto', particularly inside
range-based for loops.  Best practise is to use 'const&' unless there's
a good reason not to.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202729 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith 2014-03-03 16:48:47 +00:00
parent 653638bea4
commit 59a4517759

View File

@ -732,6 +732,27 @@ type is already obvious from the context. Another time when ``auto`` works well
for these purposes is when the type would have been abstracted away anyways,
often behind a container's typedef such as ``std::vector<T>::iterator``.
Beware unnecessary copies with ``auto``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The convenience of ``auto`` makes it easy to forget that its default behavior
is a copy. Particularly in range-based ``for`` loops, careless copies are
expensive.
As a rule of thumb, use ``const auto &`` unless you need to mutate or copy the
result.
.. code-block:: c++
// Typically there's no reason to mutate or modify Val.
for (const auto &Val : Container) { observe(Val); }
// Remove the const if you need to modify Val.
for (auto &Val : Container) { Val.change(); }
// Remove the reference if you really want a new copy.
for (auto Val : Container) { Val.change(); saveSomewhere(Val); }
Style Issues
============