From 59a451775954483bc4db825d8f9eb660b7c96a06 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Mon, 3 Mar 2014 16:48:47 +0000 Subject: 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 --- docs/CodingStandards.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'docs/CodingStandards.rst') diff --git a/docs/CodingStandards.rst b/docs/CodingStandards.rst index edf001aeda..fa7970221a 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 ============ -- cgit v1.2.3