diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-03-03 16:48:47 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-03-03 16:48:47 +0000 |
commit | 59a451775954483bc4db825d8f9eb660b7c96a06 (patch) | |
tree | 9c981e623dfbeb106f0e574cb4d573b30bca4fc5 /docs | |
parent | 653638bea4c05fa3d68378d38a5feba60096287e (diff) | |
download | llvm-59a451775954483bc4db825d8f9eb660b7c96a06.tar.gz llvm-59a451775954483bc4db825d8f9eb660b7c96a06.tar.bz2 llvm-59a451775954483bc4db825d8f9eb660b7c96a06.tar.xz |
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
Diffstat (limited to 'docs')
-rw-r--r-- | docs/CodingStandards.rst | 21 |
1 files changed, 21 insertions, 0 deletions
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<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 ============ |