Merge pull request #327 from pwnall/update_cpp

Update C++ styleguide to revision 3.277
diff --git a/cppguide.html b/cppguide.html
index 590cc9f..7f837ac 100644
--- a/cppguide.html
+++ b/cppguide.html
@@ -1,11 +1,11 @@
 <!DOCTYPE html>
-<html>
+<html lang="en">
 <head>
-<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<meta charset="utf-8">
 <title>Google C++ Style Guide</title>
-<link rel="stylesheet" type="text/css" href="include/styleguide.css">
-<script language="javascript" src="include/styleguide.js"></script>
-<link rel="shortcut icon" type="image/x-icon" href="https://www.google.com/favicon.ico" />
+<link rel="stylesheet" href="include/styleguide.css">
+<script src="include/styleguide.js"></script>
+<link rel="shortcut icon" href="https://www.google.com/favicon.ico">
 </head>
 <body onload="initStyleGuide();">
 <div id="content">
@@ -427,10 +427,14 @@
 <ol>
   <li><code><var>dir2/foo2</var>.h</code>.</li>
 
+  <li>A blank line</li>
+
   <li>C system files.</li>
 
   <li>C++ system files.</li>
 
+  <li>A blank line</li>
+
   <li>Other libraries' <code>.h</code>
   files.</li>
 
@@ -439,6 +443,8 @@
   files.</li>
 </ol>
 
+<p>Note that any adjacent blank lines should be collapsed.</p>
+
 <p>With the preferred ordering, if
 <code><var>dir2/foo2</var>.h</code> omits any necessary
 includes, the build of <code><var>dir/foo</var>.cc</code>
@@ -455,6 +461,11 @@
 
 
 
+<p>Note that the C compatibility headers such as <code>stddef.h</code>
+are essentially interchangeable with their C++ counterparts
+(<code>cstddef</code>)
+Either style is acceptable, but prefer consistency with existing code.</p>
+
 <p>Within each section the includes should be ordered
 alphabetically. Note that older code might not conform to
 this rule and should be fixed when convenient.</p>
@@ -480,8 +491,6 @@
 
 #include &lt;sys/types.h&gt;
 #include &lt;unistd.h&gt;
-
-#include &lt;hash_map&gt;
 #include &lt;vector&gt;
 
 #include "base/basictypes.h"
@@ -545,15 +554,15 @@
 the enclosing scope. Consider the following snippet, for
 example:</p>
 
-<pre>namespace X {
-inline namespace Y {
+<pre>namespace outer {
+inline namespace inner {
   void foo();
-}  // namespace Y
-}  // namespace X
+}  // namespace inner
+}  // namespace outer
 </pre>
 
-<p>The expressions <code>X::Y::foo()</code> and
-<code>X::foo()</code> are interchangeable. Inline
+<p>The expressions <code>outer::inner::foo()</code> and
+<code>outer::foo()</code> are interchangeable. Inline
 namespaces are primarily intended for ABI compatibility
 across versions.</p>
 </div>
@@ -621,13 +630,13 @@
 
 DEFINE_FLAG(bool, someflag, false, "dummy flag");
 
-namespace a {
+namespace mynamespace {
 
 using ::foo::bar;
 
-...code for a...         // Code goes against the left margin.
+...code for mynamespace...    // Code goes against the left margin.
 
-}  // namespace a
+}  // namespace mynamespace
 </pre>
   </li>
 
@@ -690,11 +699,11 @@
 <div class="stylebody">
 
 <div class="definition">
-<p>All declarations can be given internal linkage by placing them in
-unnamed namespaces, and functions and variables can be given internal linkage by
+<p>All declarations can be given internal linkage by placing them in unnamed
+namespaces. Functions and variables can also be given internal linkage by
 declaring them <code>static</code>. This means that anything you're declaring
-can't be accessed from another file. If a different file declares something
-with the same name, then the two entities are completely independent.</p>
+can't be accessed from another file. If a different file declares something with
+the same name, then the two entities are completely independent.</p>
 </div>
 
 <div class="decision">
@@ -717,10 +726,9 @@
 
 <div class="summary">
 <p>Prefer placing nonmember functions in a namespace; use completely global
-functions rarely. Prefer grouping functions with a namespace instead of
-using a class as if it were a namespace. Static methods of a class should
-generally be closely related to instances of the class or the class's static
-data.</p>
+functions rarely. Do not use a class simply to group static functions. Static
+methods of a class should generally be closely related to instances of the
+class or the class's static data.</p>
 </div>
 
  <div class="stylebody">
@@ -743,26 +751,9 @@
 can be either a static member or a nonmember function.
 Nonmember functions should not depend on external
 variables, and should nearly always exist in a namespace.
-Rather than creating classes only to group static member
-functions which do not share static data, use
-<a href="#Namespaces">namespaces</a> instead. For a header
-<code>myproject/foo_bar.h</code>, for example, write</p>
-<pre>namespace myproject {
-namespace foo_bar {
-void Function1();
-void Function2();
-}  // namespace foo_bar
-}  // namespace myproject
-</pre>
-<p>instead of</p>
-<pre class="badcode">namespace myproject {
-class FooBar {
- public:
-  static void Function1();
-  static void Function2();
-};
-}  // namespace myproject
-</pre>
+Do not create classes only to group static member functions;
+this is no different than just giving the function names a
+common prefix, and such grouping is usually unnecessary anyway.</p>
 
 <p>If you define a nonmember function and it is only
 needed in its <code>.cc</code> file, use
@@ -838,85 +829,281 @@
 <h3 id="Static_and_Global_Variables">Static and Global Variables</h3>
 
 <div class="summary">
-  <p>Variables of class type with <a href="http://en.cppreference.com/w/cpp/language/storage_duration#Storage_duration">
-    static storage duration</a> are forbidden: they cause hard-to-find bugs due
-  to indeterminate order of construction and destruction. However, such
-  variables are allowed if they are <code>constexpr</code>: they have no
-  dynamic initialization or destruction.</p>
+<p>Objects with
+<a href="http://en.cppreference.com/w/cpp/language/storage_duration#Storage_duration">
+static storage duration</a> are forbidden unless they are
+<a href="http://en.cppreference.com/w/cpp/types/is_destructible">trivially
+destructible</a>. Informally this means that the destructor does not do
+anything, even taking member and base destructors into account. More formally it
+means that the type has no user-defined or virtual destructor and that all bases
+and non-static members are trivially destructible.
+Static function-local variables may use dynamic initialization.
+Use of dynamic initialization for static class member variables or variables at
+namespace scope is discouraged, but allowed in limited circumstances; see below
+for details.</p>
+
+<p>As a rule of thumb: a global variable satisfies these requirements if its
+declaration, considered in isolation, could be <code>constexpr</code>.</p>
 </div>
 
 <div class="stylebody">
 
-<p>Objects with static storage duration, including global
-variables, static variables, static class member
-variables, and function static variables, must be Plain
-Old Data (POD): only ints, chars, floats, or pointers, or
-arrays/structs of POD.</p>
+<div class="definition">
+<p>Every object has a <dfn>storage duration</dfn>, which correlates with its
+lifetime. Objects with static storage duration live from the point of their
+initialization until the end of the program. Such objects appear as variables at
+namespace scope ("global variables"), as static data members of classes, or as
+function-local variables that are declared with the <code>static</code>
+specifier. Function-local static variables are initialized when control first
+passes through their declaration; all other objects with static storage duration
+are initialized as part of program start-up. All objects with static storage
+duration are destroyed at program exit (which happens before unjoined threads
+are terminated).</p>
 
-<p>The order in which class constructors and initializers
-for static variables are called is only partially
-specified in C++ and can even change from build to build,
-which can cause bugs that are difficult to find.
-Therefore in addition to banning globals of class type,
-we do not allow non-local static variables to be initialized
-with the result of a function, unless that function (such
-as getenv(), or getpid()) does not itself depend on any
-other globals. However, a static POD variable within
-function scope may be initialized with the result of a
-function, since its initialization order is well-defined
-and does not occur until control passes through its
-declaration.</p>
+<p>Initialization may be <dfn>dynamic</dfn>, which means that something
+non-trivial happens during initialization. (For example, consider a constructor
+that allocates memory, or a variable that is initialized with the current
+process ID.) The other kind of initialization is <dfn>static</dfn>
+initialization. The two aren't quite opposites, though: static
+initialization <em>always</em> happens to objects with static storage duration
+(initializing the object either to a given constant or to a representation
+consisting of all bytes set to zero), whereas dynamic initialization happens
+after that, if required.</p>
+</div>
 
-<p>Likewise, global and static variables are destroyed
-when the program terminates, regardless of whether the
-termination is by returning from <code>main()</code> or
-by calling <code>exit()</code>. The order in which
-destructors are called is defined to be the reverse of
-the order in which the constructors were called. Since
-constructor order is indeterminate, so is destructor
-order. For example, at program-end time a static variable
-might have been destroyed, but code still running
-&#8212; perhaps in another thread
-&#8212; tries to access it and fails. Or the
-destructor for a static <code>string</code> variable
-might be run prior to the destructor for another variable
-that contains a reference to that string.</p>
+<div class="pros">
+<p>Global and static variables are very useful for a large number of
+applications: named constants, auxiliary data structures internal to some
+translation unit, command-line flags, logging, registration mechanisms,
+background infrastructure, etc.</p>
+</div>
 
-<p>One way to alleviate the destructor problem is to
-terminate the program by calling
-<code>quick_exit()</code> instead of <code>exit()</code>.
-The difference is that <code>quick_exit()</code> does not
-invoke destructors and does not invoke any handlers that
-were registered by calling <code>atexit()</code>. If you
-have a handler that needs to run when a program
-terminates via <code>quick_exit()</code> (flushing logs,
-for example), you can register it using
-<code>at_quick_exit()</code>. (If you have a handler that
-needs to run at both <code>exit()</code> and
-<code>quick_exit()</code>, you need to register it in
-both places.)</p>
+<div class="cons">
+<p>Global and static variables that use dynamic initialization or have
+non-trivial destructors create complexity that can easily lead to hard-to-find
+bugs. Dynamic initialization is not ordered across translation units, and
+neither is destruction (except that destruction
+happens in reverse order of initialization). When one initialization refers to
+another variable with static storage duration, it is possible that this causes
+an object to be accessed before its lifetime has begun (or after its lifetime
+has ended). Moreover, when a program starts threads that are not joined at exit,
+those threads may attempt to access objects after their lifetime has ended if
+their destructor has already run.</p>
+</div>
 
-<p>As a result we only allow static variables to contain
-POD data. This rule completely disallows
-<code>std::vector</code> (use C arrays instead), or
-<code>string</code> (use <code>const char []</code>).</p>
+<div class="decision">
+<h4>Decision on destruction</h4>
+
+<p>When destructors are trivial, their execution is not subject to ordering at
+all (they are effectively not "run"); otherwise we are exposed to the risk of
+accessing objects after the end of their lifetime. Therefore, we only allow
+objects with static storage duration if they are trivially destructible.
+Fundamental types (like pointers and <code>int</code>) are trivially
+destructible, as are arrays of trivially destructible types. Note that
+variables marked with <code>constexpr</code> are trivially destructible.</p>
+<pre>const int kNum = 10;  // allowed
+
+struct X { int n; };
+const X kX[] = {{1}, {2}, {3}};  // allowed
+
+void foo() {
+  static const char* const kMessages[] = {"hello", "world"};  // allowed
+}
+
+// allowed: constexpr guarantees trivial destructor
+constexpr std::array&lt;int, 3&gt; kArray = {{1, 2, 3}};</pre>
+<pre class="badcode">// bad: non-trivial destructor
+const string kFoo = "foo";
+
+// bad for the same reason, even though kBar is a reference (the
+// rule also applies to lifetime-extended temporary objects)
+const string&amp; kBar = StrCat("a", "b", "c");
+
+void bar() {
+  // bad: non-trivial destructor
+  static std::map&lt;int, int&gt; kData = {{1, 0}, {2, 0}, {3, 0}};
+}</pre>
+
+<p>Note that references are not objects, and thus they are not subject to the
+constraints on destructibility. The constraint on dynamic initialization still
+applies, though. In particular, a function-local static reference of the form
+<code>static T&amp; t = *new T;</code> is allowed.</p>
+
+<h4>Decision on initialization</h4>
+
+<p>Initialization is a more complex topic. This is because we must not only
+consider whether class constructors execute, but we must also consider the
+evaluation of the initializer:</p>
+<pre class="neutralcode">int n = 5;    // fine
+int m = f();  // ? (depends on f)
+Foo x;        // ? (depends on Foo::Foo)
+Bar y = g();  // ? (depends on g and on Bar::Bar)</pre>
+
+<p>All but the first statement expose us to indeterminate initialization
+ordering.</p>
+
+<p>The concept we are looking for is called <em>constant initialization</em> in
+the formal language of the C++ standard. It means that the initializing
+expression is a constant expression, and if the object is initialized by a
+constructor call, then the constructor must be specified as
+<code>constexpr</code>, too:</p>
+<pre>struct Foo { constexpr Foo(int) {} };
+
+int n = 5;  // fine, 5 is a constant expression
+Foo x(2);   // fine, 2 is a constant expression and the chosen constructor is constexpr
+Foo a[] = { Foo(1), Foo(2), Foo(3) };  // fine</pre>
+
+<p>Constant initialization is always allowed. Constant initialization of
+static storage duration variables should be marked with <code>constexpr</code>
+where possible. Any non-local static storage
+duration variable that is not so marked should be presumed to have
+dynamic initialization, and reviewed very carefully.</p>
+
+<p>By contrast, the following initializations are problematic:</p>
+
+<pre class="neutralcode">time_t time(time_t*);      // not constexpr!
+int f();                   // not constexpr!
+struct Bar { Bar() {} };
+
+time_t m = time(nullptr);  // initializing expression not a constant expression
+Foo y(f());                // ditto
+Bar b;                     // chosen constructor Bar::Bar() not constexpr</pre>
+
+<p>Dynamic initialization of nonlocal variables is discouraged, and in general
+it is forbidden. However, we do permit it if no aspect of the program depends
+on the sequencing of this initialization with respect to all other
+initializations. Under those restrictions, the ordering of the initialization
+does not make an observable difference. For example:</p>
+<pre>int p = getpid();  // allowed, as long as no other static variable
+                   // uses p in its own initialization</pre>
+
+<p>Dynamic initialization of static local variables is allowed (and common).</p>
 
 
+</div>
 
-<p>If you need a static or global
-variable of a class type, consider initializing a pointer
-(which will never be freed), from either your main()
-function or from pthread_once(). Note that this must be a
-raw pointer, not a "smart" pointer, since the smart
-pointer's destructor will have the order-of-destructor
-issue that we are trying to avoid.</p>
+<h4>Common patterns</h4>
 
-
-
-
+<ul>
+  <li>Global strings: if you require a global or static string constant,
+    consider using a simple character array, or a char pointer to the first
+    element of a string literal. String literals have static storage duration
+    already and are usually sufficient.</li>
+  <li>Maps, sets, and other dynamic containers: if you require a static, fixed
+    collection, such as a set to search against or a lookup table, you cannot
+    use the dynamic containers from the standard library as a static variable,
+    since they have non-trivial destructors. Instead, consider a simple array of
+    trivial types, e.g. an array of arrays of ints (for a "map from int to
+    int"), or an array of pairs (e.g. pairs of <code>int</code> and <code>const
+    char*</code>). For small collections, linear search is entirely sufficient
+    (and efficient, due to memory locality). If necessary, keep the collection in
+    sorted order and use a binary search algorithm. If you do really prefer a
+    dynamic container from the standard library, consider using a function-local
+    static pointer, as described below.</li>
+  <li>Smart pointers (<code>unique_ptr</code>, <code>shared_ptr</code>): smart
+    pointers execute cleanup during destruction and are therefore forbidden.
+    Consider whether your use case fits into one of the other patterns described
+    in this section. One simple solution is to use a plain pointer to a
+    dynamically allocated object and never delete it (see last item).</li>
+  <li>Static variables of custom types: if you require static, constant data of
+    a type that you need to define yourself, give the type a trivial destructor
+    and a <code>constexpr</code> constructor.</li>
+  <li>If all else fails, you can create an object dynamically and never delete
+    it by binding the pointer to a function-local static pointer variable:
+    <code>static const auto* const impl = new T(args...);</code> (If the
+    initialization is more complex, it can be moved into a function or lambda
+    expression.)</li>
+</ul>
 
 </div> 
 
+<h3 id="thread_local">thread_local Variables</h3>
+
+<div class="summary">
+<p><code>thread_local</code> variables that aren't declared inside a function
+must be initialized with a true compile-time constant. Prefer
+<code>thread_local</code> over other ways of defining thread-local data.</p>
+</div>
+
+<div class="stylebody">
+
+<div class="definition">
+<p>Starting with C++11, variables can be declared with the
+<code>thread_local</code> specifier:</p>
+<pre>thread_local Foo foo = ...;
+</pre>
+<p>Such a variable is actually a collection of objects, so that when different
+threads access it, they are actually accessing different objects.
+<code>thread_local</code> variables are much like
+<a href="#Static_and_Global_Variables">static storage duration variables</a>
+in many respects. For instance, they can be declared at namespace scope,
+inside functions, or as static class members, but not as ordinary class
+members.</p>
+
+<p><code>thread_local</code> variable instances are initialized much like
+static variables, except that they must be initialized separately for each
+thread, rather than once at program startup. This means that
+<code>thread_local</code> variables declared within a function are safe, but
+other <code>thread_local</code> variables are subject to the same
+initialization-order issues as static variables (and more besides).</p>
+
+<p><code>thread_local</code> variable instances are destroyed when their thread
+terminates, so they do not have the destruction-order issues of static
+variables.</p>
+</div>
+
+<div class="pros">
+<ul>
+  <li>Thread-local data is inherently safe from races (because only one thread
+    can ordinarily access it), which makes <code>thread_local</code> useful for
+    concurrent programming.</li>
+  <li><code>thread_local</code> is the only standard-supported way of creating
+    thread-local data.</li>
+</ul>
+</div>
+
+<div class="cons">
+<ul>
+  <li>Accessing a <code>thread_local</code> variable may trigger execution of
+    an unpredictable and uncontrollable amount of other code.</li>
+  <li><code>thread_local</code> variables are effectively global variables,
+    and have all the drawbacks of global variables other than lack of
+    thread-safety.</li>
+  <li>The memory consumed by a <code>thread_local</code> variable scales with
+    the number of running threads (in the worst case), which can be quite large
+    in a  program.</li>
+  <li>An ordinary class member cannot be <code>thread_local</code>.</li>
+  <li><code>thread_local</code> may not be as efficient as certain compiler
+    intrinsics.</li>
+</ul>
+</div>
+
+<div class="decision">
+  <p><code>thread_local</code> variables inside a function have no safety
+    concerns, so they can be used without restriction. Note that you can use
+    a function-scope <code>thread_local</code> to simulate a class- or
+    namespace-scope <code>thread_local</code> by defining a function or
+    static method that exposes it:</p>
+
+<pre>Foo&amp; MyThreadLocalFoo() {
+  thread_local Foo result = ComplicatedInitialization();
+  return result;
+}
+</pre>
+
+  <p><code>thread_local</code> variables at class or namespace scope must be
+    initialized with a true compile-time constant (i.e. they must have no
+    dynamic initialization). </p>
+
+  
+
+  <p><code>thread_local</code> should be preferred over other mechanisms for
+    defining thread-local data.</p>
+</div>
+
+</div> 
+
+
 <h2 id="Classes">Classes</h2>
 
 <p>Classes are the fundamental unit of code in C++. Naturally,
@@ -1086,7 +1273,7 @@
 a waiver of this rule.</p>
 
 <p>Constructors that cannot be called with a single argument
-should usually omit <code>explicit</code>. Constructors that
+may omit <code>explicit</code>. Constructors that
 take a single <code>std::initializer_list</code> parameter should
 also omit <code>explicit</code>, in order to support copy-initialization
 (e.g. <code>MyType m = {1, 2};</code>).</p>
@@ -1097,25 +1284,32 @@
 <h3 id="Copyable_Movable_Types">Copyable and Movable Types</h3>
 <a id="Copy_Constructors"></a>
 <div class="summary">
-<p>Support copying and/or moving if these operations are clear and meaningful
-for your type. Otherwise, disable the implicitly generated special functions
-that perform copies and moves.
-</p></div>
+<p>A class's public API should make explicit whether the class is copyable,
+move-only, or neither copyable nor movable. Support copying and/or
+moving if these operations are clear and meaningful for your type.</p>
+</div>
 
 <div class="stylebody">
 
 <div class="definition">
-<p>A copyable type allows its objects to be initialized or assigned
-from any other object of the same type, without changing the value of the source.
-For user-defined types, the copy behavior is defined by the copy
-constructor and the copy-assignment operator.
-<code>string</code> is an example of a copyable type.</p>
-
 <p>A movable type is one that can be initialized and assigned
-from temporaries (all copyable types are therefore movable).
+from temporaries.</p>
+
+<p>A copyable type is one that can be initialized or assigned from
+any other object of the same type (so is also movable by definition), with the
+stipulation that the value of the source does not change.
 <code>std::unique_ptr&lt;int&gt;</code> is an example of a movable but not
-copyable type. For user-defined types, the move behavior is defined by the move
-constructor and the move-assignment operator.</p>
+copyable type (since the value of the source
+<code>std::unique_ptr&lt;int&gt;</code> must be modified during assignment to
+the destination). <code>int</code> and <code>string</code> are examples of
+movable types that are also copyable. (For <code>int</code>, the move and copy
+operations are the same; for <code>string</code>, there exists a move operation
+that is less expensive than a copy.)</p>
+
+<p>For user-defined types, the copy behavior is defined by the copy
+constructor and the copy-assignment operator. Move behavior is defined by the
+move constructor and the move-assignment operator, if they exist, or by the
+copy constructor and the copy-assignment operator otherwise.</p>
 
 <p>The copy/move constructors can be implicitly invoked by the compiler
 in some situations, e.g. when passing objects by value.</p>
@@ -1170,49 +1364,82 @@
 
 <div class="decision">
 
-<p>Provide the copy and move operations if their meaning is clear to a casual
-user and the copying/moving does not incur unexpected costs. If you define a
-copy or move constructor, define the corresponding assignment operator, and
-vice-versa. If your type is copyable, do not define move operations unless they
-are significantly more efficient than the corresponding copy operations. If your
-type is not copyable, but the correctness of a move is obvious to users of the
-type, you may make the type move-only by defining both of the move operations.
-</p>
+<p>Every class's public interface should make explicit which copy and move
+operations the class supports. This should usually take the form of explicitly
+declaring and/or deleting the appropriate operations in the <code>public</code>
+section of the declaration.</p>
 
-<p>If your type provides copy operations, it is recommended that you design
-your class so that the default implementation of those operations is correct.
-Remember to review the correctness of any defaulted operations as you would any
-other code, and to document that your class is copyable and/or cheaply movable
-if that's an API guarantee.</p>
+<p>Specifically, a copyable class should explicitly declare the copy
+operations, a move-only class should explicitly declare the move operations,
+and a non-copyable/movable class should explicitly delete the copy operations.
+Explicitly declaring or deleting all four copy/move operations is permitted,
+but not required. If you provide a copy or move assignment operator, you
+must also provide the corresponding constructor.</p>
 
-<pre class="badcode">class Foo {
+<pre>class Copyable {
  public:
-  Foo(Foo&amp;&amp; other) : field_(other.field) {}
-  // Bad, defines only move constructor, but not operator=.
+  Copyable(const Copyable&amp; rhs) = default;
+  Copyable&amp; operator=(const Copyable&amp; rhs) = default;
 
- private:
-  Field field_;
+  // The implicit move operations are suppressed by the declarations above.
+};
+
+class MoveOnly {
+ public:
+  MoveOnly(MoveOnly&amp;&amp; rhs);
+  MoveOnly&amp; operator=(MoveOnly&amp;&amp; rhs);
+
+  // The copy operations are implicitly deleted, but you can
+  // spell that out explicitly if you want:
+  MoveOnly(const MoveOnly&amp;) = delete;
+  MoveOnly&amp; operator=(const MoveOnly&amp;) = delete;
+};
+
+class NotCopyableOrMovable {
+ public:
+  // Not copyable or movable
+  NotCopyableOrMovable(const NotCopyableOrMovable&amp;) = delete;
+  NotCopyableOrMovable&amp; operator=(const NotCopyableOrMovable&amp;)
+      = delete;
+
+  // The move operations are implicitly disabled, but you can
+  // spell that out explicitly if you want:
+  NotCopyableOrMovable(NotCopyableOrMovable&amp;&amp;) = delete;
+  NotCopyableOrMovable&amp; operator=(NotCopyableOrMovable&amp;&amp;)
+      = delete;
 };
 </pre>
 
-<p>Due to the risk of slicing, avoid providing an assignment
-operator or public copy/move constructor for a class that's
-intended to be derived from (and avoid deriving from a class
+<p>These declarations/deletions can be omitted only if they are obvious: for
+example, if a base class isn't copyable or movable, derived classes naturally
+won't be either. Similarly, a <a href="#Structs_vs._Classes">struct</a>'s
+copyability/movability is normally determined by the copyability/movability
+of its data members (this does not apply to classes because in Google code
+their data members are not public). Note that if you explicitly declare or
+delete any of the copy/move operations, the others are not obvious, and so
+this paragraph does not apply (in particular, the rules in this section
+that apply to "classes" also apply to structs that declare or delete any
+copy/move operations).</p>
+
+<p>A type should not be copyable/movable if the meaning of
+copying/moving is unclear to a casual user, or if it incurs unexpected
+costs. Move operations for copyable types are strictly a performance
+optimization and are a potential source of bugs and complexity, so
+avoid defining them unless they are significantly more efficient than
+the corresponding copy operations.  If your type provides copy operations, it is
+recommended that you design your class so that the default implementation of
+those operations is correct. Remember to review the correctness of any
+defaulted operations as you would any other code.</p>
+
+<p>Due to the risk of slicing, prefer to avoid providing a public assignment
+operator or copy/move constructor for a class that's
+intended to be derived from (and prefer to avoid deriving from a class
 with such members). If your base class needs to be
 copyable, provide a public virtual <code>Clone()</code>
 method, and a protected copy constructor that derived classes
 can use to implement it.</p>
 
-<p>If you do not want to support copy/move operations on your type,
-explicitly disable them using <code>= delete</code> in
-the <code>public:</code> section:</p>
 
-<pre class="code">// MyClass is neither copyable nor movable.
-MyClass(const MyClass&amp;) = delete;
-MyClass&amp; operator=(const MyClass&amp;) = delete;
-</pre>
-
-<p></p>
 
 </div> 
 </div> 
@@ -1294,9 +1521,7 @@
 the sub-class, it can be more difficult to understand an
 implementation. The sub-class cannot override functions
 that are not virtual, so the sub-class cannot change
-implementation. The base class may also define some data
-members, so that specifies physical layout of the base
-class.</p>
+implementation.</p>
 </div>
 
 <div class="decision">
@@ -1312,23 +1537,15 @@
 that <code>Bar</code> "is a kind of"
 <code>Foo</code>.</p>
 
-<p>Make your destructor <code>virtual</code> if
-necessary. If your class has virtual methods, its
-destructor  should be virtual.</p>
-
 <p>Limit the use of <code>protected</code> to those
 member functions that might need to be accessed from
 subclasses. Note that <a href="#Access_Control">data
 members should be private</a>.</p>
 
-<p>Explicitly annotate overrides of virtual functions
-or virtual destructors with an <code>override</code>
-or (less frequently) <code>final</code> specifier.
-Older (pre-C++11) code will use the
-<code>virtual</code> keyword as an inferior
-alternative annotation. For clarity, use exactly one of
-<code>override</code>, <code>final</code>, or
-<code>virtual</code> when declaring an override.
+<p>Explicitly annotate overrides of virtual functions or virtual
+destructors with exactly one of an <code>override</code> or (less
+frequently) <code>final</code> specifier. Do not
+use <code>virtual</code> when declaring an override.
 Rationale: A function or destructor marked
 <code>override</code> or <code>final</code> that is
 not an override of a base class virtual function will
@@ -1594,14 +1811,20 @@
 <div class="summary">
 <p> Make data members <code>private</code>, unless they are
 <code>static const</code> (and follow the <a href="#Constant_Names">
-naming convention for constants</a>). For technical
+naming convention for constants</a>).</p>
+</div>
+
+<div class="stylebody">
+
+<p>For technical
 reasons, we allow data members of a test fixture class to
 be <code>protected</code> when using
 
 
 <a href="https://github.com/google/googletest">Google
 Test</a>).</p>
-</div>
+
+</div> 
 
 <h3 id="Declaration_Order">Declaration Order</h3>
 
@@ -1634,24 +1857,33 @@
 
 <h2 id="Functions">Functions</h2>
 
-<h3 id="Function_Parameter_Ordering">Parameter Ordering</h3>
+<a id="Function_Parameter_Ordering"></a>
+<h3 id="Output_Parameters">Output Parameters</h3>
 
 <div class="summary">
-<p>When defining a function, parameter order is: inputs, then
-outputs.</p>
+<p>Prefer using return values rather than output parameters.
+If output-only parameters are used they should appear after
+input parameters.</p>
 </div>
 
 <div class="stylebody">
-<p>Parameters to C/C++ functions are either input to the
-function, output from the function, or both. Input
-parameters are usually values or <code>const</code>
-references, while output and input/output parameters will
-be pointers to non-<code>const</code>. When ordering
-function parameters, put all input-only parameters before
-any output parameters. In particular, do not add new
-parameters to the end of the function just because they
-are new; place new input-only parameters before the
-output parameters.</p>
+<p>The output of a C++ function is naturally provided via
+a return value and sometimes via output parameters.</p>
+
+<p>Prefer using return values instead of output parameters
+since they improve readability and oftentimes provide the same
+or better performance.</p>
+
+<p>Parameters are either input to the function, output from the
+function, or both. Input parameters are usually values or
+<code>const</code> references, while output and input/output
+parameters will be pointers to non-<code>const</code>.</p>
+
+<p>When ordering function parameters, put all input-only
+parameters before any output parameters. In particular,
+do not add new parameters to the end of the function just
+because they are new; place new input-only parameters before
+the output parameters.</p>
 
 <p>This is not a hard-and-fast rule. Parameters that are
 both input and output (often classes/structs) muddy the
@@ -1773,7 +2005,9 @@
 <div class="definition">
 <p>You may write a function that takes a <code>const
 string&amp;</code> and overload it with another that
-takes <code>const char*</code>.</p>
+takes <code>const char*</code>. However, in this case consider
+std::string_view
+ instead.</p>
 
 <pre>class MyClass {
  public:
@@ -1800,13 +2034,13 @@
 </div>
 
 <div class="decision">
-<p>If you want to overload a function, consider qualifying
-the name with some information about the arguments, e.g.,
-<code>AppendString()</code>, <code>AppendInt()</code>
-rather than just <code>Append()</code>. If you are
-overloading a function to support variable number of
-arguments of the same type, consider making it take a
-<code>std::vector</code> so that the user can use an
+<p>You may overload a function when there are no semantic
+differences between variants, or when the differences are
+clear at the callsite.</p>
+
+<p>If you are overloading a function to support variable
+number of arguments of the same type, consider making it
+take a <code>std::vector</code> so that the user can use an
 <a href="#Braced_Initializer_List">initializer list
 </a> to specify the arguments.</p>
 </div>
@@ -1907,9 +2141,13 @@
   after the function's parameter list has already appeared. This is
   particularly true when the return type depends on template parameters.
   For example:</p>
-  <pre>template &lt;class T, class U&gt; auto add(T t, U u) -&gt; decltype(t + u);</pre>
+  <pre>    template &lt;typename T, typename U&gt;
+    auto add(T t, U u) -&gt; decltype(t + u);
+  </pre>
   versus
-  <pre>template &lt;class T, class U&gt; decltype(declval&lt;T&amp;&gt;() + declval&lt;U&amp;&gt;()) add(T t, U u);</pre>
+  <pre>    template &lt;typename T, typename U&gt;
+    decltype(declval&lt;T&amp;&gt;() + declval&lt;U&amp;&gt;()) add(T t, U u);
+  </pre>
 </div>
 
 <div class="cons">
@@ -2085,8 +2323,7 @@
 <h3 id="cpplint">cpplint</h3>
 
 <div class="summary">
-<p>Use <code>cpplint.py</code>
-to detect style errors.</p>
+<p>Use <code>cpplint.py</code> to detect style errors.</p>
 </div>
 
 <div class="stylebody">
@@ -2322,13 +2559,107 @@
 Things would probably be different if we had to do it all
 over again from scratch.</p>
 
-<p>This prohibition also applies to the exception-related
-features added in C++11, such as <code>noexcept</code>,
-<code>std::exception_ptr</code>, and
+<p>This prohibition also applies to the exception handling related
+features added in C++11, such as
+<code>std::exception_ptr</code> and
 <code>std::nested_exception</code>.</p>
 
 <p>There is an <a href="#Windows_Code">exception</a> to
 this rule (no pun intended) for Windows code.</p>
+
+</div>
+
+</div> 
+
+<h3 id="noexcept"><code>noexcept</code></h3>
+
+<div class="summary">
+<p>Specify <code>noexcept</code> when it is useful and correct.</p>
+</div>
+
+<div class="stylebody">
+<div class="definition">
+<p>The <code>noexcept</code> specifier is used to specify whether
+a function will throw exceptions or not. If an exception
+escapes from a function marked <code>noexcept</code>, the program
+crashes via <code>std::terminate</code>.</p>
+
+<p>The <code>noexcept</code> operator performs a compile-time
+check that returns true if an expression is declared to not
+throw any exceptions.</p>
+
+</div>
+
+<div class="pros">
+<ul>
+  <li>Specifying move constructors as <code>noexcept</code>
+  improves performance in some cases, e.g.
+  <code>std::vector&lt;T&gt;::resize()</code> moves rather than
+  copies the objects if T's move constructor is
+  <code>noexcept</code>.</li>
+
+  <li>Specifying <code>noexcept</code> on a function can
+  trigger compiler optimizations in environments where
+  exceptions are enabled, e.g. compiler does not have to
+  generate extra code for stack-unwinding, if it knows
+  that no exceptions can be thrown due to a
+  <code>noexcept</code> specifier.</li>
+</ul>
+</div>
+
+<div class="cons">
+<ul>
+  <li>
+  
+  In projects following this guide
+  that have exceptions disabled it is hard
+  to ensure that <code>noexcept</code>
+  specifiers are correct, and hard to define what
+  correctness even means.</li>
+
+  <li>It's hard, if not impossible, to undo <code>noexcept</code>
+  because it eliminates a guarantee that callers may be relying
+  on, in ways that are hard to detect.</li>
+</ul>
+</div>
+
+<div class="decision">
+<p>You may use <code>noexcept</code> when it is useful for
+performance if it accurately reflects the intended semantics
+of your function, i.e. that if an exception is somehow thrown
+from within the function body then it represents a fatal error.
+You can assume that <code>noexcept</code> on move constructors
+has a meaningful performance benefit. If you think
+there is significant performance benefit from specifying
+<code>noexcept</code> on some other function, please discuss it
+with 
+your project leads.</p>
+
+<p>Prefer unconditional <code>noexcept</code> if exceptions are
+completely disabled (i.e. most Google C++ environments).
+Otherwise, use conditional <code>noexcept</code> specifiers
+with simple conditions, in ways that evaluate false only in
+the few cases where the function could potentially throw.
+The tests might include type traits check on whether the
+involved operation might throw (e.g.
+<code>std::is_nothrow_move_constructible</code> for
+move-constructing objects), or on whether allocation can throw
+(e.g. <code>absl::default_allocator_is_nothrow</code> for
+standard default allocation). Note in many cases the only
+possible cause for an exception is allocation failure (we
+believe move constructors should not throw except due to
+allocation failure), and there are many applications where it&#8217;s
+appropriate to treat memory exhaustion as a fatal error rather
+than an exceptional condition that your program should attempt
+to recover from.  Even for other
+potential failures you should prioritize interface simplicity
+over supporting all possible exception throwing scenarios:
+instead of writing a complicated <code>noexcept</code> clause
+that depends on whether a hash function can throw, for example,
+simply document that your component doesn&#8217;t support hash
+functions throwing and make it unconditionally
+<code>noexcept</code>.</p>
+
 </div>
 
 </div> 
@@ -2380,7 +2711,7 @@
 <pre>bool Base::Equal(Base* other) = 0;
 bool Derived::Equal(Base* other) {
   Derived* that = dynamic_cast&lt;Derived*&gt;(other);
-  if (that == NULL)
+  if (that == nullptr)
     return false;
   ...
 }
@@ -2519,7 +2850,9 @@
 
 <div class="summary">
 <p>Use streams where appropriate, and stick to "simple"
-usages.</p>
+usages. Overload <code>&lt;&lt;</code> for streaming only for types
+representing values, and write only the user-visible value, not any
+implementation details.</p>
 </div>
 
 <div class="stylebody">
@@ -2576,12 +2909,7 @@
 
 
 <li>The streams API is subtle and complex, so programmers must
-develop experience with it in order to use it effectively.
-However, streams were historically banned in Google code (except
-for logging and diagnostics), so Google engineers tend not to
-have that experience. Consequently, streams-based code is likely
-to be less readable and maintainable by Googlers than code based
-on more familiar abstractions.</li>
+develop experience with it in order to use it effectively.</li>
 
 <li>Resolving the many overloads of <code>&lt;&lt;</code> is
 extremely costly for the compiler. When used pervasively in a
@@ -2834,8 +3162,9 @@
 <div class="stylebody">
 
 <div class="definition">
-<p> C++ does not specify the sizes of its integer types.
-Typically people assume that <code>short</code> is 16 bits,
+<p> C++ does not specify the sizes of integer types
+like <code>int</code>. Typically people assume
+that <code>short</code> is 16 bits,
 <code>int</code> is 32 bits, <code>long</code> is 32 bits
 and <code>long long</code> is 64 bits.</p>
 </div>
@@ -2894,35 +3223,32 @@
 usage of your container. When in doubt, use a larger type
 rather than a smaller type.</p>
 
-<p>Use care when converting integer types. Integer
-conversions and promotions can cause non-intuitive
-behavior. </p>
+<p>Use care when converting integer types. Integer conversions and
+promotions can cause undefined behavior, leading to security bugs and
+other problems.</p>
 </div>
 
 <div class="stylepoint_subsection">
 
 <h4>On Unsigned Integers</h4>
 
-<p>Some people, including some textbook authors,
-recommend using unsigned types to represent numbers that
-are never negative. This is intended as a form of
-self-documentation. However, in C, the advantages of such
-documentation are outweighed by the real bugs it can
-introduce. Consider:</p>
+<p>Unsigned integers are good for representing bitfields and modular
+arithmetic. Because of historical accident, the C++ standard also uses
+unsigned integers to represent the size of containers - many members
+of the standards body believe this to be a mistake, but it is
+effectively impossible to fix at this point. The fact that unsigned
+arithmetic doesn't model the behavior of a simple integer, but is
+instead defined by the standard to model modular arithmetic (wrapping
+around on overflow/underflow), means that a significant class of bugs
+cannot be diagnosed by the compiler. In other cases, the defined
+behavior impedes optimization.</p>
 
-<pre>for (unsigned int i = foo.Length()-1; i &gt;= 0; --i) ...
-</pre>
-
-<p>This code will never terminate! Sometimes gcc will
-notice this bug and warn you, but often it will not.
-Equally bad bugs can occur when comparing signed and
-unsigned variables. Basically, C's type-promotion scheme
-causes unsigned types to behave differently than one
-might expect.</p>
-
-<p>So, document that a variable is non-negative using
-assertions. Don't use an unsigned
-type.</p>
+<p>That said, mixing signedness of integer types is responsible for an
+equally large class of problems. The best advice we can provide: try
+to use iterators and containers rather than pointers and sizes, try
+not to mix signedness, and try to avoid unsigned types (except for
+representing bitfields or modular arithmetic). Do not use an unsigned
+type merely to assert that a variable is non-negative.</p>
 </div>
 
 </div> 
@@ -2938,109 +3264,27 @@
 
 <ul>
   <li>
-  <p><code>printf()</code> specifiers for some types
-  are not cleanly portable between 32-bit and 64-bit
-  systems. C99 defines some portable format specifiers.
-  Unfortunately, MSVC 7.1 does not understand some of
-  these specifiers and the standard is missing a few,
-  so we 
-  have to define our own ugly versions in some cases
-   (in the style of the standard include file
-  <code>inttypes.h</code>):</p>
-
-  <div>
-  <pre>// printf macros for size_t, in the style of inttypes.h
-#ifdef _LP64
-#define __PRIS_PREFIX "z"
-#else
-#define __PRIS_PREFIX
-#endif
-
-// Use these macros after a % in a printf format string
-// to get correct 32/64 bit behavior, like this:
-// size_t size = records.size();
-// printf("%" PRIuS "\n", size);
-
-#define PRIdS __PRIS_PREFIX "d"
-#define PRIxS __PRIS_PREFIX "x"
-#define PRIuS __PRIS_PREFIX "u"
-#define PRIXS __PRIS_PREFIX "X"
-#define PRIoS __PRIS_PREFIX "o"
-  </pre>
-  </div> 
-
-  <table border="1" summary="portable printf specifiers">
-  <tbody><tr align="center">
-    <th>Type</th>
-    <th>DO NOT use</th>
-    <th>DO use</th>
-    <th>Notes</th>
-  </tr>
-
-  <tr align="center">
-    <td><code>void *</code> (or any pointer)</td>
-    <td><code>%lx</code></td>
-    <td><code>%p</code></td>
-    <td></td>
-  </tr>
-
+  <p>Correct portable <code>printf()</code> conversion specifiers for
+  some integral typedefs rely on macro expansions that we find unpleasant to
+  use and impractical to require (the <code>PRI</code> macros from
+  <code>&lt;cinttypes&gt;</code>). Unless there is no reasonable alternative
+  for your particular case, try to avoid or even upgrade APIs that rely on the
+  <code>printf</code> family. Instead use a library supporting typesafe numeric
+  formatting, such as
   
+  <a href="#Streams"><code>std::ostream</code></a>.</p>
 
-  <tr align="center">
-    <td><code>int64_t</code></td>
-    <td><code>%qd</code>, <code>%lld</code></td>
-    <td><code>%" PRId64 "</code></td>
-    <td></td>
-  </tr>
-
+  <p>Unfortunately, the <code>PRI</code> macros are the only portable way to
+  specify a conversion for the standard bitwidth typedefs (e.g.
+  <code>int64_t</code>, <code>uint64_t</code>, <code>int32_t</code>,
+  <code>uint32_t</code>, etc).
   
-
-  <tr align="center">
-    <td><code>uint64_t</code></td>
-    <td><code>%qu</code>, <code>%llu</code>,
-                  <code>%llx</code></td>
-    <td><code>%" PRIu64 "</code>,
-                  <code>%" PRIx64 "</code></td>
-    <td></td>
-  </tr>
-
-  
-
-  <tr align="center">
-    <td><code>size_t</code></td>
-    <td><code>%u</code></td>
-    <td><code>%" PRIuS "</code>, <code>%" PRIxS "</code></td>
-    <td>
-    C99 specifies <code>%zu</code></td>
-  </tr>
-
-  <tr align="center">
-    <td><code>ptrdiff_t</code></td>
-    <td><code>%d</code></td>
-    <td><code>%" PRIdS "</code></td>
-    <td>
-    C99 specifies <code>%td</code></td>
-  </tr>
-
-  
-  </tbody></table>
-
-  <p>Note that the <code>PRI*</code> macros expand to
-  independent strings which are concatenated by the
-  compiler. Hence if you are using a non-constant
-  format string, you need to insert the value of the
-  macro into the format, rather than the name. Note also
-  that spaces are required around the macro identifier to
-  separate it from the string literal. It is
-  still possible, as usual, to include length
-  specifiers, etc., after the <code>%</code> when using
-  the <code>PRI*</code> macros. So, e.g.
-  <code>printf("x = %30" PRIuS "\n", x)</code> would
-  expand on 32-bit Linux to <code>printf("x = %30" "u"
-  "\n", x)</code>, which the compiler will treat as
-  <code>printf("x = %30u\n", x)</code>.</p>
-
-  
+  Where possible, avoid passing arguments of types specified by bitwidth
+  typedefs to <code>printf</code>-based APIs. Note that it is acceptable
+  to use typedefs for which printf has dedicated length modifiers, such as
+  <code>size_t</code> (<code>z</code>),
+  <code>ptrdiff_t</code> (<code>t</code>), and
+  <code>maxint_t</code> (<code>j</code>).</p>
   </li>
 
   <li>Remember that <code>sizeof(void *)</code> !=
@@ -3063,13 +3307,12 @@
   <code>__declspec(align())</code>.</li>
 
   <li>
-  <p>Use the <code>LL</code> or <code>ULL</code>
-  suffixes as needed to create 64-bit constants. For
-  example:</p>
+  <p>Use <a href="#Casting">braced-initialization</a> as needed to create
+  64-bit constants. For example:</p>
 
 
-<pre>int64_t my_value = 0x123456789LL;
-uint64_t my_mask = 3ULL &lt;&lt; 48;
+<pre>int64_t my_value{0x123456789};
+uint64_t my_mask{3ULL &lt;&lt; 48};
 </pre>
   </li>
 </ul>
@@ -3168,30 +3411,25 @@
 <h3 id="0_and_nullptr/NULL">0 and nullptr/NULL</h3>
 
 <div class="summary">
-<p>Use <code>0</code> for integers, <code>0.0</code> for
-reals, <code>nullptr</code> (or <code>NULL</code>) for
-pointers, and <code>'\0'</code> for chars.</p>
+<p>Use <code>0</code> for integers, <code>0.0</code> for reals,
+<code>nullptr</code> for pointers, and <code>'\0'</code> for chars.</p>
 </div>
 
 <div class="stylebody">
 
-<p>Use <code>0</code> for integers and <code>0.0</code>
-for reals. This is not controversial.</p>
+<p>Use <code>0</code> for integers and <code>0.0</code> for reals.</p>
 
-<p> For
-pointers (address values), there is a choice between
-<code>0</code>, <code>NULL</code>, and
-<code>nullptr</code>. For projects that allow C++11
-features, use <code>nullptr</code>. For C++03 projects,
-we prefer <code>NULL</code> because it looks like a
-pointer. In fact, some C++ compilers provide special
-definitions of <code>NULL</code> which enable them to
-give useful warnings, particularly in situations where
-<code>sizeof(NULL)</code> is not equal to
-<code>sizeof(0)</code>.</p>
+<p>For pointers (address values), there is a choice between <code>0</code>,
+<code>NULL</code>, and <code>nullptr</code>. For projects that allow C++11
+features, use <code>nullptr</code>, as this provides type-safety.</p>
 
-<p>Use <code>'\0'</code> for chars. This is the correct
-type and also makes code more readable.</p>
+<p>For C++03 projects, prefer <code>NULL</code> to <code>0</code>. While the
+values are equivalent, <code>NULL</code> looks more like a pointer to the
+reader, and some C++ compilers provide special definitions of <code>NULL</code>
+which enable them to give useful warnings.</p>
+
+<p>Use <code>'\0'</code> for the null character. Using the correct type makes
+the code more readable.</p>
 
 </div> 
 
@@ -3241,8 +3479,8 @@
 <div class="stylebody">
 
 <div class="pros">
-<p>
-</p><ul>
+
+<ul>
 <li>C++ type names can be long and cumbersome, especially when they
 involve templates or namespaces.</li>
 <li>When a C++ type name is repeated within a single declaration or a
@@ -3349,7 +3587,7 @@
 std::vector&lt;string&gt; v = {"foo", "bar"};
 
 // Usable with 'new' expressions.
-auto p = new vector&lt;string&gt;{"foo", "bar"};
+auto p = new std::vector&lt;string&gt;{"foo", "bar"};
 
 // A map can take a list of pairs. Nested braced-init-lists work.
 std::map&lt;int, string&gt; m = {{1, "one"}, {2, "2"}};
@@ -3938,7 +4176,8 @@
   <code>Foo f = {.field = 3}</code>), inline assembly, <code>__COUNTER__</code>,
   <code>__PRETTY_FUNCTION__</code>, compound statement expressions (e.g.
   <code>foo = ({ int x; Bar(&amp;x); x })</code>, variable-length arrays and
-  <code>alloca()</code>, and the <code>a?:b</code> syntax.</p>
+  <code>alloca()</code>, and the "<a href="https://en.wikipedia.org/wiki/Elvis_operator">Elvis Operator</a>"
+  <code>a?:b</code>.</p>
 </div>
 
 <div class="pros">
@@ -3986,6 +4225,10 @@
 using other_namespace::Foo;
 </pre>
 
+  <p>In new code, <code>using</code> is preferable to <code>typedef</code>,
+  because it provides a more consistent syntax with the rest of C++ and works
+  with templates.</p>
+
   <p>Like other declarations, aliases declared in a header file are part of that
   header's public API unless they're in a function definition, in the private portion of a class,
   or in an explicitly-marked internal namespace. Aliases in such areas or in .cc files are
@@ -4031,32 +4274,32 @@
 </p>
 
 <p>For example, these aliases document how they are intended to be used in client code:</p>
-<pre>namespace a {
+<pre>namespace mynamespace {
 // Used to store field measurements. DataPoint may change from Bar* to some internal type.
 // Client code should treat it as an opaque pointer.
-using DataPoint = foo::bar::Bar*;
+using DataPoint = foo::Bar*;
 
 // A set of measurements. Just an alias for user convenience.
 using TimeSeries = std::unordered_set&lt;DataPoint, std::hash&lt;DataPoint&gt;, DataPointComparator&gt;;
-}  // namespace a
+}  // namespace mynamespace
 </pre>
 
 <p>These aliases don't document intended use, and half of them aren't meant for client use:</p>
 
-<pre class="badcode">namespace a {
+<pre class="badcode">namespace mynamespace {
 // Bad: none of these say how they should be used.
-using DataPoint = foo::bar::Bar*;
+using DataPoint = foo::Bar*;
 using std::unordered_set;  // Bad: just for local convenience
 using std::hash;           // Bad: just for local convenience
 typedef unordered_set&lt;DataPoint, hash&lt;DataPoint&gt;, DataPointComparator&gt; TimeSeries;
-}  // namespace a
+}  // namespace mynamespace
 </pre>
 
 <p>However, local convenience aliases are fine in function definitions, private sections of
   classes, explicitly marked internal namespaces, and in .cc files:</p>
 
 <pre>// In a .cc file
-using std::unordered_set;
+using foo::Bar;
 </pre>
 
 </div>
@@ -4091,11 +4334,17 @@
 understandable by a new reader. Do not use abbreviations
 that are ambiguous or unfamiliar to readers outside your
 project, and do not abbreviate by deleting letters within
-a word.</p>
+a word. Abbreviations that would be familiar to someone
+outside your project with relevant domain knowledge are OK.
+As a rule of thumb, an abbreviation is probably OK if it's listed
+in
+
+Wikipedia.</p>
 
 <pre>int price_count_reader;    // No abbreviation.
 int num_errors;            // "num" is a widespread convention.
 int num_dns_connections;   // Most people know what "DNS" stands for.
+int lstm_size;             // "LSTM" is a common machine learning abbreviation.
 </pre>
 
 <pre class="badcode">int n;                     // Meaningless.
@@ -4104,12 +4353,20 @@
 int wgc_connections;       // Only your group knows what this stands for.
 int pc_reader;             // Lots of things can be abbreviated "pc".
 int cstmr_id;              // Deletes internal letters.
+FooBarRequestInfo fbri;    // Not even a word.
 </pre>
 
 <p>Note that certain universally-known abbreviations are OK, such as
 <code>i</code> for an iteration variable and <code>T</code> for a
 template parameter.</p>
 
+<p>For some symbols, this style guide recommends names to start with a capital
+letter and to have a capital letter for each new word (a.k.a.
+"<a href="https://en.wikipedia.org/wiki/Camel_case">Camel Case</a>"
+or "Pascal case"). When abbreviations appear in such names, prefer to
+capitalize the abbreviations as single words (i.e. <code>StartRpc()</code>,
+not <code>StartRPC()</code>).</p>
+
 <p>Template parameters should follow the naming style for their
 category: type template parameters should follow the rules for
 <a href="#Type_Names">type names</a>, and non-type template
@@ -4268,9 +4525,9 @@
   see <a href="http://en.cppreference.com/w/cpp/language/storage_duration#Storage_duration">
     Storage Duration</a> for details) should be named this way.  This
   convention is optional for variables of other storage classes, e.g. automatic
-  variables, otherwise the usual variable naming rules apply.</p><p>
+  variables, otherwise the usual variable naming rules apply.</p>
 
-</p></div> 
+</div> 
 
 <h3 id="Function_Names">Function Names</h3>
 
@@ -4282,11 +4539,7 @@
 <div class="stylebody">
 
 <p>Ordinarily, functions should start with a capital letter and have a
-capital letter for each new word
-(a.k.a. "<a href="https://en.wikipedia.org/wiki/Camel_case">Camel
-Case</a>" or "Pascal case"). Such names should not have
-underscores. Prefer to capitalize acronyms as single words
-(i.e. <code>StartRpc()</code>, not <code>StartRPC()</code>).</p>
+capital letter for each new word.</p>
 
 <pre>AddTableEntry()
 DeleteUrl()
@@ -4295,8 +4548,8 @@
 
 <p>(The same naming rule applies to class- and namespace-scope
 constants that are exposed as part of an API and that are intended to look
-like functions, because the fact that they're
-objects rather than functions is an unimportant implementation detail.)</p>
+like functions, because the fact that they're objects rather than functions
+is an unimportant implementation detail.)</p>
 
 <p>Accessors and mutators (get and set functions) may be named like
 variables. These often correspond to actual member variables, but this is
@@ -4318,7 +4571,7 @@
 <p>The name of a top-level namespace should usually be the
 name of the project or team whose code is contained in that
 namespace. The code in that namespace should usually be in
-a directory whose basename matches the namespace name (or
+a directory whose basename matches the namespace name (or in
 subdirectories thereof).</p>
 
 
@@ -4398,7 +4651,8 @@
 <div class="summary">
 <p>You're not really going to <a href="#Preprocessor_Macros">
 define a macro</a>, are you? If you do, they're like this:
-<code>MY_MACRO_THAT_SCARES_SMALL_CHILDREN</code>.</p>
+<code>MY_MACRO_THAT_SCARES_SMALL_CHILDREN_AND_ADULTS_ALIKE</code>.
+</p>
 </div>
 
 <div class="stylebody">
@@ -4500,7 +4754,9 @@
 BSD, LGPL, GPL).</p>
 
 <p>If you make significant changes to a file with an
-author line, consider deleting the author line.</p>
+author line, consider deleting the author line.
+New files should usually not contain copyright notice or
+author line.</p>
 
 <h4 class="stylepoint_subsection">File Contents</h4>
 
@@ -4619,13 +4875,7 @@
 </pre>
 
 <p>However, do not be unnecessarily verbose or state the
-completely obvious. Notice below that it is not necessary
- to say "returns false otherwise" because this is
-implied.</p>
-
-<pre>// Returns true if the table cannot hold any more entries.
-bool IsTableFull();
-</pre>
+completely obvious.</p>
 
 <p>When documenting function overrides, focus on the
 specifics of the override itself, rather than repeating
@@ -4791,7 +5041,7 @@
   <li>Replace large or complex nested expressions with named variables.</li>
 
   <li>As a last resort, use comments to clarify argument meanings at the
-  call site.</li>
+  call site. </li>
 </ul>
 
 Consider the following example:
@@ -5135,8 +5385,8 @@
 <ul>
   <li>Choose good parameter names.</li>
 
-  <li>Parameter names may be omitted only if the parameter is unused and its
-  purpose is obvious.</li>
+  <li>A parameter name may be omitted only if the parameter is not used in the
+  function's definition.</li>
 
   <li>If you cannot fit the return type and the function
   name on a single line, break between them.</li>
@@ -5429,7 +5679,7 @@
 conditions or statements may be more readable with curly
 braces. Some 
 projects require that an
-<code>if</code> must always always have an accompanying
+<code>if</code> must always have an accompanying
 brace.</p>
 
 <pre>if (condition)
@@ -5475,7 +5725,7 @@
 <p>Switch statements may use braces for blocks. Annotate
 non-trivial fall-through between cases.
 Braces are optional for single-statement loops.
-Empty loop bodies should use empty braces or <code>continue</code>.</p>
+Empty loop bodies should use either empty braces or <code>continue</code>.</p>
 </div>
 
 <div class="stylebody">
@@ -5489,10 +5739,9 @@
 statements should always have a <code>default</code> case
 (in the case of an enumerated value, the compiler will
 warn you if any values are not handled). If the default
-case should never execute, simply
-<code>assert</code>:</p>
+case should never execute, treat this as an error. For example:
 
- 
+</p> 
 
 <div>
 <pre>switch (var) {
@@ -5526,8 +5775,8 @@
 </pre>
 
 
-<p>Empty loop bodies should use an empty pair of braces or <code>continue</code>,
-but not a single semicolon.</p>
+<p>Empty loop bodies should use either an empty pair of braces or
+<code>continue</code> with no braces, rather than a single semicolon.</p>
 
 <pre>while (condition) {
   // Repeat test until it returns false.
@@ -5582,6 +5831,11 @@
 const string&amp; str;
 </pre>
 
+<p>You should do this consistently within a single
+file,
+so, when modifying an existing file, use the style in
+that file.</p>
+
 It is allowed (if unusual) to declare multiple variables in the same
 declaration, but it is disallowed if any of those have pointer or
 reference decorations. Such declarations are easily misread.
@@ -5593,11 +5847,6 @@
 const string &amp; str;  // Bad - spaces on both sides of &amp;
 </pre>
 
-<p>You should do this consistently within a single
-file,
-so, when modifying an existing file, use the style in
-that file.</p>
-
 </div> 
 
 <h3 id="Boolean_Expressions">Boolean Expressions</h3>
@@ -5691,8 +5940,8 @@
 non-<code>std::initializer_list</code> constructor, use parentheses
 instead of braces.</p>
 
-<pre>std::vector&lt;int&gt; v(100, 1);  // A vector of 100 1s.
-std::vector&lt;int&gt; v{100, 1};  // A vector of 100, 1.
+<pre>std::vector&lt;int&gt; v(100, 1);  // A vector containing 100 items: All 1s.
+std::vector&lt;int&gt; v{100, 1};  // A vector containing 2 items: 100 and 1.
 </pre>
 
 <p>Also, the brace form prevents narrowing of integral
@@ -5867,7 +6116,7 @@
 
 <pre class="badcode">namespace {
 
-  // Wrong.  Indented when it should not be.
+  // Wrong!  Indented when it should not be.
   void foo() {
     ...
   }
@@ -6138,7 +6387,7 @@
 
 </div> 
 
-<h2 class="ignoreLink">Parting Words</h2>
+<h2 id="Parting_Words">Parting Words</h2>
 
 <p>Use common sense and <em>BE CONSISTENT</em>.</p>