From: Duncan P. N. Exon Smith Date: Mon, 3 Mar 2014 16:48:47 +0000 (+0000) Subject: C++11: Beware unnecessary copies with auto X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=59a451775954483bc4db825d8f9eb660b7c96a06;p=oota-llvm.git 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 --- diff --git a/docs/CodingStandards.rst b/docs/CodingStandards.rst index edf001aeda0..fa7970221a0 100644 --- a/docs/CodingStandards.rst +++ b/docs/CodingStandards.rst @@ -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::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 ============