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 | 994863768773ccdb76606b5fc4dabb6745f5da23 (patch) | |
| tree | 8266a71177053c8198869a5316c079498cea679b /llvm/docs | |
| parent | 9724e833ce35b0ebf6db8096e5a7cdd65a35660e (diff) | |
| download | bcm5719-llvm-994863768773ccdb76606b5fc4dabb6745f5da23.tar.gz bcm5719-llvm-994863768773ccdb76606b5fc4dabb6745f5da23.zip | |
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.
llvm-svn: 202729
Diffstat (limited to 'llvm/docs')
| -rw-r--r-- | llvm/docs/CodingStandards.rst | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/docs/CodingStandards.rst b/llvm/docs/CodingStandards.rst index edf001aeda0..fa7970221a0 100644 --- a/llvm/docs/CodingStandards.rst +++ b/llvm/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 ============ |

