Full Code of google/styleguide for AI

gh-pages c098353acb6d cached
55 files
1.8 MB
455.0k tokens
11 symbols
1 requests
Download .txt
Showing preview only (1,863K chars total). Download the full file or copy to clipboard to get everything.
Repository: google/styleguide
Branch: gh-pages
Commit: c098353acb6d
Files: 55
Total size: 1.8 MB

Directory structure:
gitextract_omg5k8n9/

├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE.md
│   └── PULL_REQUEST_TEMPLATE.md
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── Rguide.md
├── Rguide.xml
├── _includes/
│   └── head-custom.html
├── angularjs-google-style.html
├── assets/
│   └── css/
│       └── style.scss
├── cppguide.html
├── cppguide.xml
├── csharp-style.md
├── docguide/
│   ├── README.md
│   ├── READMEs.md
│   ├── VERSION
│   ├── best_practices.md
│   ├── philosophy.md
│   └── style.md
├── eclipse-cpp-google-style.xml
├── eclipse-java-google-style.xml
├── go/
│   ├── best-practices.md
│   ├── decisions.md
│   ├── guide.md
│   └── index.md
├── google-c-style.el
├── google-r-style.html
├── google_python_style.vim
├── htmlcssguide.html
├── htmlcssguide.xml
├── include/
│   ├── jsguide.js
│   ├── styleguide.css
│   └── styleguide.js
├── intellij-java-google-style.xml
├── javaguide.css
├── javaguide.html
├── javascriptguide.xml
├── jsguide.html
├── jsoncstyleguide.html
├── jsoncstyleguide.xml
├── lispguide.xml
├── objcguide.md
├── objcguide.xml
├── pyguide.md
├── pylintrc
├── shell.xml
├── shell.xsl
├── shellguide.md
├── styleguide.css
├── styleguide.xsl
├── tsguide.html
├── vimscriptfull.xml
├── vimscriptguide.xml
└── xmlstyle.html

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/CODEOWNERS
================================================
# https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax

csharp-style.md @jbcoe
htmlcssguide.html @tonyruscoe
shellguide.md @eatnumber1 @vapier
/go/ @chressie @gaal @katrinahoffert @kliegs @matttproud


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
This repository publishes copies of Google's internal style guides to
assist developers working on Google owned and originated open source
projects. Development on these guides does not take place here.

Substantive changes to the style rules and suggested new rules should
not be submitted as issues in this repository. Material changes must be
proposed, discussed, and approved on the internal forums first.

If an issue points out a simple mistake — a typo, a broken link, etc. —
then a correction might be made. However there is no commitment to do
so. Issues are normally closed without comment. 


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
These style guides are copies of Google's internal style guides to
assist developers working on Google owned and originated open source
projects. Changes should be made to the internal style guide first and
only then copied here.

Unsolicited pull requests will not be merged and are usually closed
without comment. If a PR points out a simple mistake — a typo, a broken
link, etc. — then the correction can be made internally and copied here
through the usual process.

Substantive changes to the style rules and suggested new rules should
not be submitted as a PR in this repository. Material changes must be
proposed, discussed, and approved on the internal forums first.


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Repo maintainers are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Repo maintainers have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].

Community Impact Guidelines were inspired by 
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].

For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ].

[homepage]: https://www.contributor-covenant.org
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq


================================================
FILE: LICENSE
================================================
Creative Commons Legal Code

Attribution 3.0 Unported

    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
    LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
    REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR
    DAMAGES RESULTING FROM ITS USE.

License

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
CONDITIONS.

1. Definitions

 a. "Adaptation" means a work based upon the Work, or upon the Work and
    other pre-existing works, such as a translation, adaptation,
    derivative work, arrangement of music or other alterations of a
    literary or artistic work, or phonogram or performance and includes
    cinematographic adaptations or any other form in which the Work may be
    recast, transformed, or adapted including in any form recognizably
    derived from the original, except that a work that constitutes a
    Collection will not be considered an Adaptation for the purpose of
    this License. For the avoidance of doubt, where the Work is a musical
    work, performance or phonogram, the synchronization of the Work in
    timed-relation with a moving image ("synching") will be considered an
    Adaptation for the purpose of this License.
 b. "Collection" means a collection of literary or artistic works, such as
    encyclopedias and anthologies, or performances, phonograms or
    broadcasts, or other works or subject matter other than works listed
    in Section 1(f) below, which, by reason of the selection and
    arrangement of their contents, constitute intellectual creations, in
    which the Work is included in its entirety in unmodified form along
    with one or more other contributions, each constituting separate and
    independent works in themselves, which together are assembled into a
    collective whole. A work that constitutes a Collection will not be
    considered an Adaptation (as defined above) for the purposes of this
    License.
 c. "Distribute" means to make available to the public the original and
    copies of the Work or Adaptation, as appropriate, through sale or
    other transfer of ownership.
 d. "Licensor" means the individual, individuals, entity or entities that
    offer(s) the Work under the terms of this License.
 e. "Original Author" means, in the case of a literary or artistic work,
    the individual, individuals, entity or entities who created the Work
    or if no individual or entity can be identified, the publisher; and in
    addition (i) in the case of a performance the actors, singers,
    musicians, dancers, and other persons who act, sing, deliver, declaim,
    play in, interpret or otherwise perform literary or artistic works or
    expressions of folklore; (ii) in the case of a phonogram the producer
    being the person or legal entity who first fixes the sounds of a
    performance or other sounds; and, (iii) in the case of broadcasts, the
    organization that transmits the broadcast.
 f. "Work" means the literary and/or artistic work offered under the terms
    of this License including without limitation any production in the
    literary, scientific and artistic domain, whatever may be the mode or
    form of its expression including digital form, such as a book,
    pamphlet and other writing; a lecture, address, sermon or other work
    of the same nature; a dramatic or dramatico-musical work; a
    choreographic work or entertainment in dumb show; a musical
    composition with or without words; a cinematographic work to which are
    assimilated works expressed by a process analogous to cinematography;
    a work of drawing, painting, architecture, sculpture, engraving or
    lithography; a photographic work to which are assimilated works
    expressed by a process analogous to photography; a work of applied
    art; an illustration, map, plan, sketch or three-dimensional work
    relative to geography, topography, architecture or science; a
    performance; a broadcast; a phonogram; a compilation of data to the
    extent it is protected as a copyrightable work; or a work performed by
    a variety or circus performer to the extent it is not otherwise
    considered a literary or artistic work.
 g. "You" means an individual or entity exercising rights under this
    License who has not previously violated the terms of this License with
    respect to the Work, or who has received express permission from the
    Licensor to exercise rights under this License despite a previous
    violation.
 h. "Publicly Perform" means to perform public recitations of the Work and
    to communicate to the public those public recitations, by any means or
    process, including by wire or wireless means or public digital
    performances; to make available to the public Works in such a way that
    members of the public may access these Works from a place and at a
    place individually chosen by them; to perform the Work to the public
    by any means or process and the communication to the public of the
    performances of the Work, including by public digital performance; to
    broadcast and rebroadcast the Work by any means including signs,
    sounds or images.
 i. "Reproduce" means to make copies of the Work by any means including
    without limitation by sound or visual recordings and the right of
    fixation and reproducing fixations of the Work, including storage of a
    protected performance or phonogram in digital form or other electronic
    medium.

2. Fair Dealing Rights. Nothing in this License is intended to reduce,
limit, or restrict any uses free from copyright or rights arising from
limitations or exceptions that are provided for in connection with the
copyright protection under copyright law or other applicable laws.

3. License Grant. Subject to the terms and conditions of this License,
Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
perpetual (for the duration of the applicable copyright) license to
exercise the rights in the Work as stated below:

 a. to Reproduce the Work, to incorporate the Work into one or more
    Collections, and to Reproduce the Work as incorporated in the
    Collections;
 b. to create and Reproduce Adaptations provided that any such Adaptation,
    including any translation in any medium, takes reasonable steps to
    clearly label, demarcate or otherwise identify that changes were made
    to the original Work. For example, a translation could be marked "The
    original work was translated from English to Spanish," or a
    modification could indicate "The original work has been modified.";
 c. to Distribute and Publicly Perform the Work including as incorporated
    in Collections; and,
 d. to Distribute and Publicly Perform Adaptations.
 e. For the avoidance of doubt:

     i. Non-waivable Compulsory License Schemes. In those jurisdictions in
        which the right to collect royalties through any statutory or
        compulsory licensing scheme cannot be waived, the Licensor
        reserves the exclusive right to collect such royalties for any
        exercise by You of the rights granted under this License;
    ii. Waivable Compulsory License Schemes. In those jurisdictions in
        which the right to collect royalties through any statutory or
        compulsory licensing scheme can be waived, the Licensor waives the
        exclusive right to collect such royalties for any exercise by You
        of the rights granted under this License; and,
   iii. Voluntary License Schemes. The Licensor waives the right to
        collect royalties, whether individually or, in the event that the
        Licensor is a member of a collecting society that administers
        voluntary licensing schemes, via that society, from any exercise
        by You of the rights granted under this License.

The above rights may be exercised in all media and formats whether now
known or hereafter devised. The above rights include the right to make
such modifications as are technically necessary to exercise the rights in
other media and formats. Subject to Section 8(f), all rights not expressly
granted by Licensor are hereby reserved.

4. Restrictions. The license granted in Section 3 above is expressly made
subject to and limited by the following restrictions:

 a. You may Distribute or Publicly Perform the Work only under the terms
    of this License. You must include a copy of, or the Uniform Resource
    Identifier (URI) for, this License with every copy of the Work You
    Distribute or Publicly Perform. You may not offer or impose any terms
    on the Work that restrict the terms of this License or the ability of
    the recipient of the Work to exercise the rights granted to that
    recipient under the terms of the License. You may not sublicense the
    Work. You must keep intact all notices that refer to this License and
    to the disclaimer of warranties with every copy of the Work You
    Distribute or Publicly Perform. When You Distribute or Publicly
    Perform the Work, You may not impose any effective technological
    measures on the Work that restrict the ability of a recipient of the
    Work from You to exercise the rights granted to that recipient under
    the terms of the License. This Section 4(a) applies to the Work as
    incorporated in a Collection, but this does not require the Collection
    apart from the Work itself to be made subject to the terms of this
    License. If You create a Collection, upon notice from any Licensor You
    must, to the extent practicable, remove from the Collection any credit
    as required by Section 4(b), as requested. If You create an
    Adaptation, upon notice from any Licensor You must, to the extent
    practicable, remove from the Adaptation any credit as required by
    Section 4(b), as requested.
 b. If You Distribute, or Publicly Perform the Work or any Adaptations or
    Collections, You must, unless a request has been made pursuant to
    Section 4(a), keep intact all copyright notices for the Work and
    provide, reasonable to the medium or means You are utilizing: (i) the
    name of the Original Author (or pseudonym, if applicable) if supplied,
    and/or if the Original Author and/or Licensor designate another party
    or parties (e.g., a sponsor institute, publishing entity, journal) for
    attribution ("Attribution Parties") in Licensor's copyright notice,
    terms of service or by other reasonable means, the name of such party
    or parties; (ii) the title of the Work if supplied; (iii) to the
    extent reasonably practicable, the URI, if any, that Licensor
    specifies to be associated with the Work, unless such URI does not
    refer to the copyright notice or licensing information for the Work;
    and (iv) , consistent with Section 3(b), in the case of an Adaptation,
    a credit identifying the use of the Work in the Adaptation (e.g.,
    "French translation of the Work by Original Author," or "Screenplay
    based on original Work by Original Author"). The credit required by
    this Section 4 (b) may be implemented in any reasonable manner;
    provided, however, that in the case of a Adaptation or Collection, at
    a minimum such credit will appear, if a credit for all contributing
    authors of the Adaptation or Collection appears, then as part of these
    credits and in a manner at least as prominent as the credits for the
    other contributing authors. For the avoidance of doubt, You may only
    use the credit required by this Section for the purpose of attribution
    in the manner set out above and, by exercising Your rights under this
    License, You may not implicitly or explicitly assert or imply any
    connection with, sponsorship or endorsement by the Original Author,
    Licensor and/or Attribution Parties, as appropriate, of You or Your
    use of the Work, without the separate, express prior written
    permission of the Original Author, Licensor and/or Attribution
    Parties.
 c. Except as otherwise agreed in writing by the Licensor or as may be
    otherwise permitted by applicable law, if You Reproduce, Distribute or
    Publicly Perform the Work either by itself or as part of any
    Adaptations or Collections, You must not distort, mutilate, modify or
    take other derogatory action in relation to the Work which would be
    prejudicial to the Original Author's honor or reputation. Licensor
    agrees that in those jurisdictions (e.g. Japan), in which any exercise
    of the right granted in Section 3(b) of this License (the right to
    make Adaptations) would be deemed to be a distortion, mutilation,
    modification or other derogatory action prejudicial to the Original
    Author's honor and reputation, the Licensor will waive or not assert,
    as appropriate, this Section, to the fullest extent permitted by the
    applicable national law, to enable You to reasonably exercise Your
    right under Section 3(b) of this License (right to make Adaptations)
    but not otherwise.

5. Representations, Warranties and Disclaimer

UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.

6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR
ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. Termination

 a. This License and the rights granted hereunder will terminate
    automatically upon any breach by You of the terms of this License.
    Individuals or entities who have received Adaptations or Collections
    from You under this License, however, will not have their licenses
    terminated provided such individuals or entities remain in full
    compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
    survive any termination of this License.
 b. Subject to the above terms and conditions, the license granted here is
    perpetual (for the duration of the applicable copyright in the Work).
    Notwithstanding the above, Licensor reserves the right to release the
    Work under different license terms or to stop distributing the Work at
    any time; provided, however that any such election will not serve to
    withdraw this License (or any other license that has been, or is
    required to be, granted under the terms of this License), and this
    License will continue in full force and effect unless terminated as
    stated above.

8. Miscellaneous

 a. Each time You Distribute or Publicly Perform the Work or a Collection,
    the Licensor offers to the recipient a license to the Work on the same
    terms and conditions as the license granted to You under this License.
 b. Each time You Distribute or Publicly Perform an Adaptation, Licensor
    offers to the recipient a license to the original Work on the same
    terms and conditions as the license granted to You under this License.
 c. If any provision of this License is invalid or unenforceable under
    applicable law, it shall not affect the validity or enforceability of
    the remainder of the terms of this License, and without further action
    by the parties to this agreement, such provision shall be reformed to
    the minimum extent necessary to make such provision valid and
    enforceable.
 d. No term or provision of this License shall be deemed waived and no
    breach consented to unless such waiver or consent shall be in writing
    and signed by the party to be charged with such waiver or consent.
 e. This License constitutes the entire agreement between the parties with
    respect to the Work licensed here. There are no understandings,
    agreements or representations with respect to the Work not specified
    here. Licensor shall not be bound by any additional provisions that
    may appear in any communication from You. This License may not be
    modified without the mutual written agreement of the Licensor and You.
 f. The rights granted under, and the subject matter referenced, in this
    License were drafted utilizing the terminology of the Berne Convention
    for the Protection of Literary and Artistic Works (as amended on
    September 28, 1979), the Rome Convention of 1961, the WIPO Copyright
    Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996
    and the Universal Copyright Convention (as revised on July 24, 1971).
    These rights and subject matter take effect in the relevant
    jurisdiction in which the License terms are sought to be enforced
    according to the corresponding provisions of the implementation of
    those treaty provisions in the applicable national law. If the
    standard suite of rights granted under applicable copyright law
    includes additional rights not granted under this License, such
    additional rights are deemed to be included in the License; this
    License is not intended to restrict the license of any rights under
    applicable law.


Creative Commons Notice

    Creative Commons is not a party to this License, and makes no warranty
    whatsoever in connection with the Work. Creative Commons will not be
    liable to You or any party on any legal theory for any damages
    whatsoever, including without limitation any general, special,
    incidental or consequential damages arising in connection to this
    license. Notwithstanding the foregoing two (2) sentences, if Creative
    Commons has expressly identified itself as the Licensor hereunder, it
    shall have all rights and obligations of Licensor.

    Except for the limited purpose of indicating to the public that the
    Work is licensed under the CCPL, Creative Commons does not authorize
    the use by either party of the trademark "Creative Commons" or any
    related trademark or logo of Creative Commons without the prior
    written consent of Creative Commons. Any permitted use will be in
    compliance with Creative Commons' then-current trademark usage
    guidelines, as may be published on its website or otherwise made
    available upon request from time to time. For the avoidance of doubt,
    this trademark restriction does not form part of this License.

    Creative Commons may be contacted at https://creativecommons.org/.


================================================
FILE: README.md
================================================
# Google Style Guides

Every major open-source project has its own style guide: a set of conventions
(sometimes arbitrary) about how to write code for that project. It is much
easier to understand a large codebase when all the code in it is in a consistent
style.

“Style” covers a lot of ground, from “use camelCase for variable names” to
“never use global variables” to “never use exceptions.” This project
([google/styleguide](https://github.com/google/styleguide)) links to the style
guidelines we use for Google code. If you are modifying a project that
originated at Google, you may be pointed to this page to see the style guides
that apply to that project.


*   [AngularJS Style Guide][angular]
*   [Common Lisp Style Guide][cl]
*   [C++ Style Guide][cpp]
*   [C# Style Guide][csharp]
*   [Go Style Guide][go]
*   [HTML/CSS Style Guide][htmlcss]
*   [JavaScript Style Guide][js]
*   [Java Style Guide][java]
*   [JSON Style Guide][json]
*   [Markdown Style Guide][markdown]
*   [Objective-C Style Guide][objc]
*   [Python Style Guide][py]
*   [R Style Guide][r]
*   [Shell Style Guide][sh]
*   [Swift Style Guide][swift]
*   [TypeScript Style Guide][ts]
*   [Vim script Style Guide][vim]

This project also contains [google-c-style.el][emacs], an Emacs settings file
for Google style.

We used to host the cpplint tool, but we stopped making internal updates public.
An open source community has forked the project, so users are encouraged to use
https://github.com/cpplint/cpplint instead.

If your project requires that you create a new XML document format, the
[XML Document Format Style Guide][xml] may be helpful. In addition to actual
style rules, it also contains advice on designing your own vs. adapting an
existing format, on XML instance document formatting, and on elements vs.
attributes.

The style guides in this project are licensed under the CC-By 3.0 License, which
encourages you to share these documents. See
[https://creativecommons.org/licenses/by/3.0/][ccl] for more details.

The following Google style guide lives outside of this project:

*  [Effective Dart][dart]
*  [Kotlin Style Guide][kotlin]

Since projects are largely maintained in a [VCS], writing good commit messages
is important to long term project health. Please refer to [How to Write a Git
Commit Message](https://cbea.ms/git-commit/) as an excellent resource. While it
explicitly refers to the Git [SCM], its principles apply to any system, and many
Git conventions are trivial to translate to others.

## Contributing

With few exceptions, these style guides are copies of Google's internal style
guides to assist developers working on Google owned and originated open source
projects. Changes to the style guides are made to the internal style guides
first and eventually copied into the versions found here. **External
contributions are not accepted.** Pull requests are regularly closed without
comment.

People can file [issues using the GitHub tracker][gh-tracker]. Issues that raise
questions, justify changes on technical merits, or point out obvious mistakes
may get some engagement and could in theory lead to changes, but we are
primarily optimizing for Google's internal needs.

<a rel="license" href="https://creativecommons.org/licenses/by/3.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/3.0/88x31.png" /></a>

[cpp]: https://google.github.io/styleguide/cppguide.html
[csharp]: https://google.github.io/styleguide/csharp-style.html
[swift]: https://google.github.io/swift/
[objc]: objcguide.md
[gh-tracker]: https://github.com/google/styleguide/issues
[go]: go/
[java]: https://google.github.io/styleguide/javaguide.html
[json]: https://google.github.io/styleguide/jsoncstyleguide.xml
[kotlin]: https://developer.android.com/kotlin/style-guide
[py]: https://google.github.io/styleguide/pyguide.html
[r]: https://google.github.io/styleguide/Rguide.html
[sh]: https://google.github.io/styleguide/shellguide.html
[htmlcss]: https://google.github.io/styleguide/htmlcssguide.html
[js]: https://google.github.io/styleguide/jsguide.html
[markdown]: https://google.github.io/styleguide/docguide/style.html
[ts]: https://google.github.io/styleguide/tsguide.html
[angular]: https://google.github.io/styleguide/angularjs-google-style.html
[cl]: https://google.github.io/styleguide/lispguide.xml
[vim]: https://google.github.io/styleguide/vimscriptguide.xml
[emacs]: https://raw.githubusercontent.com/google/styleguide/gh-pages/google-c-style.el
[xml]: https://google.github.io/styleguide/xmlstyle.html
[dart]: https://www.dartlang.org/guides/language/effective-dart
[ccl]: https://creativecommons.org/licenses/by/3.0/
[SCM]: https://en.wikipedia.org/wiki/Source_control_management
[VCS]: https://en.wikipedia.org/wiki/Version_control_system


================================================
FILE: Rguide.md
================================================
# Google's R Style Guide

R is a high-level programming language used primarily for statistical computing
and graphics. The goal of the R Programming Style Guide is to make our R code
easier to read, share, and verify.

The Google R Style Guide is a fork of the
[Tidyverse Style Guide](https://style.tidyverse.org/) by Hadley Wickham
[license](https://creativecommons.org/licenses/by-sa/2.0/). Google modifications
were developed in collaboration with the internal R user community. The rest of
this document explains Google's primary differences with the Tidyverse guide,
and why these differences exist.

## Syntax

### Naming conventions

Google prefers identifying functions with `BigCamelCase` to clearly distinguish
them from other objects.

```
# Good
DoNothing <- function() {
  return(invisible(NULL))
}
```

The names of private functions should begin with a dot. This helps communicate
both the origin of the function and its intended use.

```
# Good
.DoNothingPrivately <- function() {
  return(invisible(NULL))
}
```

We previously recommended naming objects with `dot.case`. We're moving away from
that, as it creates confusion with S3 methods.

### Don't use attach()

The possibilities for creating errors when using `attach()` are numerous.

## Pipes

### Right-hand assignment

We do not support using right-hand assignment.

```
# Bad
iris %>%
  dplyr::summarize(max_petal = max(Petal.Width)) -> results
```

This convention differs substantially from practices in other languages and
makes it harder to see in code where an object is defined. E.g. searching for
`foo <-` is easier than searching for `foo <-` and `-> foo` (possibly split over
lines).

### Use explicit returns

Do not rely on R's implicit return feature. It is better to be clear about your
intent to `return()` an object.

```
# Good
AddValues <- function(x, y) {
  return(x + y)
}

# Bad
AddValues <- function(x, y) {
  x + y
}
```

### Qualifying namespaces

Users should explicitly qualify namespaces for all external functions.

```
# Good
purrr::map()
```

We discourage using the `@import` Roxygen tag to bring in all functions into a
NAMESPACE. Google has a very big R codebase, and importing all functions creates
too much risk for name collisions.

While there is a small performance penalty for using `::`, it makes it easier to
understand dependencies in your code. There are some exceptions to this rule.

*   Infix functions (`%name%`) always need to be imported.
*   Certain `rlang` pronouns, notably `.data`, need to be imported.
*   Functions from default R packages, including `datasets`, `utils`,
   `grDevices`, `graphics`, `stats` and `methods`. If needed, you can `@import`
   the full package.

When importing functions, place the `@importFrom` tag in the Roxygen header
above the function where the external dependency is used.

## Documentation

### Package-level documentation

All packages should have a package documentation file, in a
`packagename-package.R` file.


================================================
FILE: Rguide.xml
================================================
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta http-equiv="refresh" content="0; URL=Rguide.html"/>
    <link rel="stylesheet" type="text/css" href="styleguide.css"/>
    <title>Google's R Style Guide</title>
  </head>
  <body>
    <h1>Google's R Style Guide</h1>
    <p>
      The style guide has moved to <a href="Rguide.html">Rguide.html</a>
    </p>
  </body>
</html>


================================================
FILE: _includes/head-custom.html
================================================
<link rel="shortcut icon" type="image/x-icon" href="/styleguide/favicon.ico">


================================================
FILE: angularjs-google-style.html
================================================

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "https://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
    <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <script src="include/styleguide.js"></script>
    <link href="/styleguide/favicon.ico" type="image/x-icon" rel="shortcut icon">
    <script src="include/jsguide.js"></script>
    <link rel="stylesheet" type="text/css" href="styleguide.css">
    <script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script>
    <title>Google's AngularJS Style Guide</title>
    <style type="text/css"><!--
    th { background-color: #ddd; }
    //--></style>
</head>
<body onload="initStyleGuide();">
<h1 class="external">An AngularJS Style Guide for Closure Users at Google</h1>

<h2 id="Background" class="ignoreLink">Background</h2>

<p class="external">This is the external version of a document that was primarily written for Google
    engineers. It describes a recommended style for AngularJS apps that use Closure, as used
    internally at Google. Members of the broader AngularJS community should feel free to apply
    (or not apply) these recommendations, as relevant to their own use cases.</p>

<p class="external">This document describes style for AngularJS apps in google3. This guide
    supplements and extends the <a href="https://google.github.io/styleguide/jsguide.html">
        Google JavaScript Style Guide</a>.
</p>

<p><b>Style Note</b>: Examples on the AngularJS external webpage, and many external apps, are
    written in a style that freely uses closures, favors functional inheritance, and does not often use
    <a class="external"
                               href="https://github.com/google/closure-compiler/wiki/Types-in-the-Closure-Type-System">
        JavaScript types</a>. Google follows a more rigorous Javascript style to support JSCompiler
    optimizations and large code bases - see the javascript-style mailing list.
    This is not an Angular-specific issue, and is not discussed further in this style guide.
    (But if you want further reading:
    <a  href="http://martinfowler.com/bliki/Lambda.html">Martin Fowler on closures</a>,
    <a href="http://jibbering.com/faq/notes/closures/">much longer description</a>, appendix A of the
    <a href="https://books.google.com/books/about/Closure_The_Definitive_Guide.html?id=p7uyWPcVGZsC">
        closure book</a> has a good description of inheritance patterns and why it prefers
    pseudoclassical,
    <a href="https://books.google.com/books/about/JavaScript.html?id=PXa2bby0oQ0C">
        Javascript, the Good Parts</a> as a counter.)</p>

<h2>1 Angular Language Rules</h2>

<h3 id="googprovide">Manage dependencies with Closure's goog.require and goog.provide</h3>
<p>Choose a namespace for your project, and use goog.provide and goog.require.</p>
<pre class="prettyprint lang-js">
goog.provide('hello.about.AboutCtrl');
goog.provide('hello.versions.Versions');
</pre>

<p><b>Why?</b>
    Google BUILD rules integrate nicely with closure provide/require.</p>

<h3 id="modules">Modules</h3>

<p>Your main application module should be in your root client directory. A module should never be
    altered other than the one where it is defined.</p>

<p>Modules may either be defined in the same file as their components (this works well for a module
    that contains exactly one service) or in a separate file for wiring pieces together.</p>

<p><b>Why?</b>
    A module should be consistent for anyone that wants to include it as a reusable component.
    If a module can mean different things depending on which files are included, it is not consistent.
</p>

<h3 id="moduledeps">
    Modules should reference other modules using the Angular Module's "name" property
</h3>

<p>For example:</p>

<pre class="prettyprint lang-js">
// file submodulea.js:
  goog.provide('my.submoduleA');

  my.submoduleA = angular.module('my.submoduleA', []);
  // ...

// file app.js
  goog.require('my.submoduleA');

  Yes: my.application.module = angular.module('hello', [my.submoduleA.name]);
  <font color="red">
      No: my.application.module = angular.module('hello', ['my.submoduleA']);
  </font></pre>

<p><b>Why?</b>
    Using a property of my.submoduleA prevents Closure presubmit failures complaining that the file is
    required but never used. Using the .name property avoids duplicating strings.</p>

<h3 id="externs">Use a common externs file</h3>

<p>This maximally allows the JS compiler to enforce type safety in the presence of externally
    provided types from Angular, and means you don't have to worry about Angular vars being obfuscated
    in a confusing way. </p>

<p>Note to readers outside Google: the current externs file is located in an internal-to-Google
    directory, but an example can be found on github <a href="https://github.com/angular/angular.js/pull/4722">
        here</a>.</p>

<h3 id="compilerflags">JSCompiler Flags</h3>
<p><b>Reminder</b>: According to the JS style guide, customer facing code must be compiled.</p>

<p><b>Recommended</b>: Use the JSCompiler (the closure compiler that works with js_binary by
    default) and ANGULAR_COMPILER_FLAGS_FULL from //javascript/angular/build_defs/build_defs for
    your base flags.
</p>

<p>Note - if you are using @export for methods, you will need to add the compiler flag</p>
<pre>
"--generate_exports",
</pre>

<p>If you are using @export for properties, you will need to add the flags:</p>
<pre>
"--generate_exports",
"--remove_unused_prototype_props_in_externs=false",
"--export_local_property_definitions",
</pre>

<h3 id="controllers">Controllers and Scopes</h3>
<p>Controllers are classes. Methods should be defined on MyCtrl.prototype.</p>

<p>Google Angular applications should use the <b>'controller as'</b> style to export the controller
    onto the scope. This is fully implemented in Angular 1.2 and can be mimicked in pre-Angular 1.2
    builds.
</p>

<p>Pre Angular 1.2, this looks like:</p>
<pre class="prettyprint lang-js">
/**
 * Home controller.
 *
 * @param {!angular.Scope} $scope
 * @constructor
 * @ngInject
 * @export
 */
hello.mainpage.HomeCtrl = function($scope) {
  /** @export */
  $scope.homeCtrl = this; // This is a bridge until Angular 1.2 controller-as

  /**
   * @type {string}
   * @export
   */
  this.myColor = 'blue';
};


/**
 * @param {number} a
 * @param {number} b
 * @export
 */
hello.mainpage.HomeCtrl.prototype.add = function(a, b) {
  return a + b;
};
</pre>

<p>And the template:</p>

<pre>
&lt;div ng-controller="hello.mainpage.HomeCtrl"/&gt;
  &lt;span ng-class="homeCtrl.myColor"&gt;I'm in a color!&lt;/span&gt;
  &lt;span&gt;{{homeCtrl.add(5, 6)}}&lt;/span&gt;
&lt;/div&gt;
</pre>

<p>After Angular 1.2, this looks like:</p>

<pre class="prettyprint lang-js">
/**
 * Home controller.
 *
 * @constructor
 * @ngInject
 * @export
 */
hello.mainpage.HomeCtrl = function() {
  /**
   * @type {string}
   * @export
   */
  this.myColor = 'blue';
};


/**
 * @param {number} a
 * @param {number} b
 * @export
 */
hello.mainpage.HomeCtrl.prototype.add = function(a, b) {
  return a + b;
};
</pre>

<p>If you are compiling with property renaming, expose properties and methods using the @export
    annotation. Remember to @export the constructor as well.</p>

<p>And in the template:</p>

<pre>
&lt;div ng-controller="hello.mainpage.HomeCtrl as homeCtrl"/&gt;
  &lt;span ng-class="homeCtrl.myColor"&gt;I'm in a color!&lt;/span&gt;
  &lt;span&gt;{{homeCtrl.add(5, 6)}}&lt;/span&gt;
&lt;/div&gt;
</pre>

<p><b>Why?</b>
    Putting methods and properties directly onto the controller, instead of building up a scope
    object, fits better with the Google Closure class style. Additionally, using 'controller as'
    makes it obvious which controller you are accessing when multiple controllers apply to an element.
    Since there is always a '.' in the bindings, you don't have to worry about prototypal inheritance
    masking primitives.</p>

<h3 id="directives">Directives</h3>

<p>All DOM manipulation should be done inside directives. Directives should be kept small and use
    composition. Files defining directives should goog.provide a static function which returns the
    directive definition object.</p>

<pre class="prettyprint lang-js">
goog.provide('hello.pane.paneDirective');

/**
 * Description and usage
 * @return {angular.Directive} Directive definition object.
 */
hello.pane.paneDirective = function() {
  // ...
};
</pre>

<p><b>Exception</b>: DOM manipulation may occur in services for DOM elements disconnected from the
    rest of the view, e.g. dialogs or keyboard shortcuts.</p>

<h3 id="services">Services</h3>

<p>Services registered on the module with <code>module.service</code> are classes.
    Use <code>module.service</code> instead of <code>module.provider</code> or
    <code>module.factory</code> unless you need to do initialization beyond just creating a
    new instance of the class.</p>

<pre class="prettyprint lang-js">
/**
 * @param {!angular.$http} $http The Angular http service.
 * @constructor
 */
hello.request.Request = function($http) {
  /** @type {!angular.$http} */
  this.http_ = $http;
};

hello.request.Request.prototype.get = function() {/*...*/};
</pre>

<p>In the module:</p>

<pre class="prettyprint lang-js">
module.service('request', hello.request.Request);
</pre>


<h2>2 Angular Style Rules</h2>

<h3 id="dollarsign">Reserve $ for Angular properties and services</h3>
<p>Do not use $ to prepend your own object properties and service identifiers. Consider this style
    of naming reserved by AngularJS and jQuery.</p>

<p>Yes:</p>
<pre class="prettyprint lang-js">
  $scope.myModel = { value: 'foo' }
  myModule.service('myService', function() { /*...*/ });
  var MyCtrl = function($http) {this.http_ = $http;};
</pre>

<p><font color="red">No:</font></p>
<pre class="prettyprint">
  $scope.$myModel = { value: 'foo' } // BAD
  $scope.myModel = { $value: 'foo' } // BAD
  myModule.service('$myService', function() { ... }); // BAD
  var MyCtrl = function($http) {this.$http_ = $http;}; // BAD
</pre>

<p><b>Why?</b>
    It's useful to distinguish between Angular / jQuery builtins and things you add yourself.
    In addition, $ is not an acceptable character for variables names in the JS style guide.
</p>

<h3 id="customelements">Custom elements</h3>

<p>For custom elements (e.g. <code>&lt;ng-include src="template"&gt;&lt;/ng-include&gt;</code>), IE8
    requires special support (html5shiv-like hacks) to enable css styling.  Be aware of this
    restriction in apps targeting old versions of IE.</p>

<h2>3 Angular Tips, Tricks, and Best Practices</h2>

<p>These are not strict style guide rules, but are placed here as reference for folks getting
    started with Angular at Google.</p>

<h3 id="testing">Testing</h3>

<p>Angular is designed for test-driven development.</p>

<p>The recommended unit testing setup is Jasmine + Karma (though you could use closure tests
    or js_test)</p>

<p>Angular provides easy adapters to load modules and use the injector in Jasmine tests.
<ul>
    <li><a href = "https://docs.angularjs.org/api/angular.mock.module">module</a>
    <li><a href="https://docs.angularjs.org/api/angular.mock.inject">inject</a>
</ul>
</p>


<h3 id="appstructure">Consider using the Best Practices for App Structure</h3>
<p>
    This  <a href="https://docs.google.com/document/d/1XXMvReO8-Awi1EZXAXS4PzDzdNvV6pGcuaF4Q9821Es/pub">directory structure doc</a> describes how to structure your application with controllers in
    nested subdirectories and all components (e.g. services and directives) in a 'components' dir.
</p>


<h3 id="scopeinheritance">Be aware of how scope inheritance works</h3>

<p>See <a href="https://github.com/angular/angular.js/wiki/Understanding-Scopes#wiki-JSproto">
    The Nuances of Scope Prototypal Inheritance</a></p>

<h3 id="nginject">Use @ngInject for easy dependency injection compilation</h3>
<p>This removes the need to add <code>myCtrl['$inject'] = ...</code> to prevent minification from
    messing up Angular's dependency injection.</p>

<p>Usage:</p>
<pre class="prettyprint lang-js">
/**
 * My controller.
 * @param {!angular.$http} $http
 * @param {!my.app.myService} myService
 * @constructor
 * @export
 * @ngInject
 */
my.app.MyCtrl = function($http, myService) {
  //...
};
</pre>

<h2 id="bestpractices">4 Best practices links and docs</h2>

<ul>
    <li><a href="https://github.com/angular/angular.js/wiki/Best-Practices">
        Best Practices</a> from Angular on GitHub</li>
    <li><a href="https://www.youtube.com/watch?v=ZhfUv0spHCY">
        Meetup video</a> (not Google specific)</li>
</ul>
<address>
    Last modified Feb 07 2013
</address>
</body>
<html>


================================================
FILE: assets/css/style.scss
================================================
---
# Keep this YAML front matter block to trigger Jekyll processing.
# See https://jekyllrb.com/docs/frontmatter for more information.
---

@import "{{ site.theme }}";

// Hide “This site is open source. Improve this page.”
.footer {
  display: none;
}


================================================
FILE: cppguide.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Google C++ Style Guide</title>
<link rel="stylesheet" href="include/styleguide.css">
<script src="include/styleguide.js"></script>
<link rel="shortcut icon" href="/styleguide/favicon.ico">
</head>
<body onload="initStyleGuide();">
<div id="content">
<h1>Google C++ Style Guide</h1>
<div class="horizontal_toc" id="tocDiv"></div>

<h2 id="Background" class="ignoreLink">Background</h2>

<p>C++ is one of the main development languages  used by
many of Google's open-source projects. As every C++
programmer knows, the language has many powerful features, but
this power brings with it complexity, which in turn can make
code more bug-prone and harder to read and maintain.</p>

<p>The goal of this guide is to manage this complexity by
describing in detail the dos and don'ts of writing C++
code. These rules exist to
keep  the codebase manageable while still allowing
coders to use C++ language features productively.</p>

<p><em>Style</em>, also known as readability, is what we call
the conventions that govern our C++ code. The term Style is a
bit of a misnomer, since these conventions cover far more than
just source file formatting.</p>

<p>
Most open-source projects developed by
Google conform to the requirements in this guide.
</p>



<p>Note that this guide is not a C++ tutorial: we assume that
the reader is familiar with the language. </p>

<h3 id="Goals">Goals of the Style Guide</h3>

<p>Why do we have this document?</p>

<p>There are a few core goals that we believe this guide should
serve. These are the fundamental <b>why</b>s that
underlie all of the individual rules. By bringing these ideas to
the fore, we hope to ground discussions and make it clearer to our
broader community why the rules are in place and why particular
decisions have been made. If you understand what goals each rule is
serving, it should be clearer to everyone when a rule may be waived
(some can be), and what sort of argument or alternative would be
necessary to change a rule in the guide.</p>

<p>The goals of the style guide as we currently see them are as follows:</p>
<dl>
<dt>Style rules should pull their weight</dt>
<dd>The benefit of a style rule
must be large enough to justify asking all of our engineers to
remember it. The benefit is measured relative to the codebase we would
get without the rule, so a rule against a very harmful practice may
still have a small benefit if people are unlikely to do it
anyway. This principle mostly explains the rules we don't have, rather
than the rules we do: for example, <code>goto</code> contravenes many
of the following principles, but is already vanishingly rare, so the Style
Guide doesn't discuss it.</dd>

<dt>Optimize for the reader, not the writer</dt>
<dd>Our codebase (and most individual components submitted to it) is
expected to continue for quite some time. As a result, more time will
be spent reading most of our code than writing it. We explicitly
choose to optimize for the experience of our average software engineer
reading, maintaining, and debugging code in our codebase rather than
ease when writing said code.  "Leave a trace for the reader" is a
particularly common sub-point of this principle: When something
surprising or unusual is happening in a snippet of code (for example,
transfer of pointer ownership), leaving textual hints for the reader
at the point of use is valuable (<code>std::unique_ptr</code>
demonstrates the ownership transfer unambiguously at the call
site). </dd>

<dt>Be consistent with existing code</dt>
<dd>Using one style consistently through our codebase lets us focus on
other (more important) issues. Consistency also allows for automation:
tools that format your code or adjust your <code>#include</code>s only
work properly when your code is consistent with the expectations of
the tooling. In many cases, rules that are attributed to "Be
Consistent" boil down to "Just pick one and stop worrying about it";
the potential value of allowing flexibility on these points is
outweighed by the cost of having people argue over them. However,
there are limits to consistency; it is a good tie breaker when there
is no clear technical argument, nor a long-term direction. It applies
more heavily locally (per file, or for a tightly-related set of
interfaces). Consistency should not generally be used as a
justification to do things in an old style without considering the
benefits of the new style, or the tendency of the codebase to converge
on newer styles over time.</dd>

<dt>Be consistent with the broader C++ community when appropriate</dt>
<dd>Consistency with the way other organizations use C++ has value for
the same reasons as consistency within our codebase. If a feature in
the C++ standard solves a problem, or if some idiom is widely known
and accepted, that's an argument for using it. However, sometimes
standard features and idioms are flawed, or were just designed without
our codebase's needs in mind. In those cases (as described below) it's
appropriate to constrain or ban standard features.  In some cases we
prefer a homegrown or third-party library over a library defined in
the C++ Standard, either out of perceived superiority or insufficient
value to transition the codebase to the standard interface.</dd>

<dt>Avoid surprising or dangerous constructs</dt>
<dd>C++ has features that are more surprising or dangerous than one
might think at a glance. Some style guide restrictions are in place to
prevent falling into these pitfalls. There is a high bar for style
guide waivers on such restrictions, because waiving such rules often
directly risks compromising program correctness.
</dd>

<dt>Avoid constructs that our average C++ programmer would find tricky
or hard to maintain</dt>
<dd>C++ has features that may not be generally appropriate because of
the complexity they introduce to the code. In widely used
code, it may be more acceptable to use
trickier language constructs, because any benefits of more complex
implementation are multiplied widely by usage, and the cost in understanding
the complexity does not need to be paid again when working with new
portions of the codebase. When in doubt, waivers to rules of this type
can be sought by asking
your project leads. This is specifically
important for our codebase because code ownership and team membership
changes over time: even if everyone that works with some piece of code
currently understands it, such understanding is not guaranteed to hold a
few years from now.</dd>

<dt>Be mindful of our scale</dt>
<dd>With a codebase of 100+ million lines and thousands of engineers,
some mistakes and simplifications for one engineer can become costly
for many. For instance it's particularly important to
avoid polluting the global namespace: name collisions across a
codebase of hundreds of millions of lines are difficult to work with
and hard to avoid if everyone puts things into the global
namespace.</dd>

<dt>Concede to optimization when necessary</dt>
<dd>Performance optimizations can sometimes be necessary and
appropriate, even when they conflict with the other principles of this
document.</dd>
</dl>

<p>The intent of this document is to provide maximal guidance with
reasonable restriction. As always, common sense and good taste should
prevail. By this we specifically refer to the established conventions
of the entire Google C++ community, not just your personal preferences
or those of your team. Be skeptical about and reluctant to use
clever or unusual constructs: the absence of a prohibition is not the
same as a license to proceed.  Use your judgment, and if you are
unsure, please don't hesitate to ask your project leads to get additional
input.</p>



<h2 id="C++_Version">C++ Version</h2>

<p>Currently, code should target C++20, i.e., should not use C++23
  features. The C++ version targeted by this guide will advance
  (aggressively) over time.</p>



<p>Do not use
  <a href="#Nonstandard_Extensions">non-standard extensions</a>.</p>

<div>
<p>Consider portability to other environments before using features
from C++17 and C++20 in your project.</p>
</div>

<h2 id="Header_Files">Header Files</h2>

<p>In general, every <code>.cc</code> file should have an
associated <code>.h</code> file. There are some common
exceptions, such as unit tests and small <code>.cc</code> files containing
just a <code>main()</code> function.</p>

<p>Correct use of header files can make a huge difference to
the readability, size and performance of your code.</p>

<p>The following rules will guide you through the various
pitfalls of using header files.</p>

<a id="The_-inl.h_Files"></a>
<h3 id="Self_contained_Headers">Self-contained Headers</h3>

<p>Header files should be self-contained (compile on their own) and
end in <code>.h</code>.  Non-header files that are meant for inclusion
should end in <code>.inc</code> and be used sparingly.</p>

<p>All header files should be self-contained. Users and refactoring
tools should not have to adhere to special conditions to include the
header. Specifically, a header should
have <a href="#The__define_Guard">header guards</a> and include all
other headers it needs.</p>

<p>When a header declares inline functions or templates that clients of the
header will instantiate, the inline functions and templates must also have
definitions in the header, either directly or in files it includes.  Do not move
these definitions to separately included header (<code>-inl.h</code>) files;
this practice was common in the past, but is no longer allowed.  When all
instantiations of a template occur in one <code>.cc</code> file, either because
they're <a href="https://en.cppreference.com/w/cpp/language/class_template#Explicit_instantiation">
explicit</a> or because the definition is accessible to only
the <code>.cc</code> file, the template definition can be kept in that file.</p>

<p>There are rare cases where a file designed to be included is not
self-contained.  These are typically intended to be included at unusual
locations, such as the middle of another file.  They might not
use <a href="#The__define_Guard">header guards</a>, and might not include
their prerequisites.  Name such files with the <code>.inc</code>
extension.  Use sparingly, and prefer self-contained headers when
possible.</p>

<h3 id="The__define_Guard">The #define Guard</h3>

<p>All header files should have <code>#define</code> guards to
prevent multiple inclusion. The format of the symbol name
should be

<code><i>&lt;PROJECT&gt;</i>_<i>&lt;PATH&gt;</i>_<i>&lt;FILE&gt;</i>_H_</code>.</p>



<div>
<p>To guarantee uniqueness, they should
be based on the full path in a project's source tree. For
example, the file <code>foo/src/bar/baz.h</code> in
project <code>foo</code> should have the following
guard:</p>
</div>

<pre class="goodcode">#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_

...

#endif  // FOO_BAR_BAZ_H_
</pre>



<h3 id="Include_What_You_Use">Include What You Use</h3>

<p>If a source or header file refers to a symbol defined elsewhere,
the file should directly include a header file which properly intends
to provide a declaration or definition of that symbol. It should not
include header files for any other reason.
</p>

<p>Do not rely on transitive inclusions. This allows people to remove
no-longer-needed <code>#include</code> statements from their headers without
breaking clients. This also applies to related headers
- <code>foo.cc</code> should include <code>bar.h</code> if it uses a
symbol from it even if <code>foo.h</code>
includes <code>bar.h</code>.</p>

<h3 id="Forward_Declarations">Forward Declarations</h3>

<p>Avoid using forward declarations where possible.
  Instead, <a href="#Include_What_You_Use">include the headers you need</a>.
</p>


<p class="definition"></p>
<p>A "forward declaration" is a declaration of an entity
  without an associated definition.</p>
<pre class="neutralcode">// In a C++ source file:
class B;
void FuncInB();
extern int variable_in_b;
ABSL_DECLARE_FLAG(flag_in_b);
</pre>

<p class="pros"></p>
<ul>
  <li>Forward declarations can save compile time, as
  <code>#include</code>s force the compiler to open
  more files and process more input.</li>

  <li>Forward declarations can save on unnecessary
  recompilation. <code>#include</code>s can force
  your code to be recompiled more often, due to unrelated
  changes in the header.</li>
</ul>

<p class="cons"></p>
<ul>
  <li>Forward declarations can hide a dependency, allowing
  user code to skip necessary recompilation when headers
  change.</li>

  <li>A forward declaration as opposed to an <code>#include</code> statement
    makes it difficult for automatic tooling to discover the module
    defining the symbol.</li>

  <li>A forward declaration may be broken by subsequent
  changes to the library. Forward declarations of functions
  and templates can prevent the header owners from making
  otherwise-compatible changes to their APIs, such as
  widening a parameter type, adding a template parameter
  with a default value, or migrating to a new namespace.</li>

  <li>Forward declaring symbols from namespace
  <code>std::</code> yields undefined behavior.</li>

  <li>It can be difficult to determine whether a forward
  declaration or a full <code>#include</code> is needed.
  Replacing an <code>#include</code> with a forward
  declaration can silently change the meaning of
  code:
<pre class="neutralcode">// b.h:
struct B {};
struct D : B {};

// good_user.cc:
#include "b.h"
void f(B*);
void f(void*);
void test(D* x) { f(x); }  // Calls f(B*)
</pre>
  If the <code>#include</code> was replaced with forward
  decls for <code>B</code> and <code>D</code>,
  <code>test()</code> would call <code>f(void*)</code>.
  </li>

  <li>Forward declaring multiple symbols from a header
  can be more verbose than simply
  <code>#include</code>ing the header.</li>

  <li>Structuring code to enable forward declarations
  (e.g., using pointer members instead of object members)
  can make the code slower and more complex.</li>


</ul>

<p class="decision"></p>
<p>Try to avoid forward declarations of entities
defined in another project.</p>

<a id="Inline_Functions"></a>
<h3 id="Defining_Functions_in_Header_Files">Defining Functions in Header Files</h3>

<p>Include the definition of a function at its point of declaration in a header file only
when the definition is short. If the definition otherwise has a reason be in the header,
put it in an internal part of the file. If necessary to make the definition ODR-safe, mark
it with an <code>inline</code> specifier.</p>

<p class="definition"></p>
<p>Functions defined in header files are sometimes referred to as "inline functions",
which is a somewhat overloaded term that refers to several distinct but overlapping
situations:</p>

<ol>
  <li>A <em>textually inline</em> symbol's definition is exposed to the reader at
  the point of declaration.</li>
  <li>A function or variable defined in a header file is <em>expandable inline</em>
  since its definition is available for
  <a href="https://en.wikipedia.org/wiki/Inline_expansion">inline expansion</a>
  by the compiler, which can lead to more efficient object code.</li>
  <li><em>ODR-safe</em> entities do not violate the
  <a href="https://en.cppreference.com/w/cpp/language/definition">"One Definition Rule"</a>,
  which often requires the <a href="https://en.cppreference.com/w/cpp/language/inline">inline</a>
  keyword for things defined in header files
  .</li>
</ol>

<p>While functions tend to be a more common source of confusion, these definitions apply to
variables as well, and so do the rules here.</p>

<p class="pros"></p>

<ul>
<li>Defining a function textually in-line reduces boilerplate code for simple functions
like accessors and mutators.</li>

<li> As noted above, function definitions in header files <i>can</i> lead to
more efficient object code for small functions due to inline expansion by the
compiler.</li>

<li>Function templates and <code>constexpr</code> functions generally need to
be defined in the header file that declares them (but not necessarily the public part).</li>
</ul>

<p class="cons"></p>

<ul>
<li>Embedding a function definition in the public API makes the API harder to skim,
and incurs cognitive overhead for readers of that API- the more complex the function
the higher the cost.</li>

<li>Public definitions expose implementation details that are at best harmless and
often extraneous.</li>
</ul>

<p class="decision"></p>
<p>Only define a function at its public declaration if it is short, say, 10 lines or fewer. Put
longer function bodies in the <code>.cc</code> file unless they must be in the header for
performance or technical reasons.</p>

<p>Even if a definition must be in the header, this is not a sufficient reason to put it within
the public part. Instead, the definition can be in an internal part of the header, such as the
<a href="#Access_Control">private</a> section of a class, within a namespace that includes the word
<code>internal</code>, or below a comment like <code>// Implementation details only
below here</code>.</p>

<p>Once a definition is in a header file, it must be ODR-safe by having the <code>inline</code>
specifier or being implicitly specified inline by being a function template or defined in a class
body when first declared.</p>

<pre class="goodcode">template &lt;typename T&gt;
class Foo {
 public:
  int bar() { return bar_; }

  void MethodWithHugeBody();

 private:
  int bar_;
};

// Implementation details only below here

template &lt;typename T&gt;
void Foo&lt;T&gt;::MethodWithHugeBody() {
  ...
}
</pre>

<h3 id="Names_and_Order_of_Includes">Names and Order of Includes</h3>

<p>Include headers in the following order: Related header, C system headers,
C++ standard library headers,
other libraries' headers, your project's
headers.</p>

<p>
All of a project's header files should be
listed as descendants of the project's source
directory without use of UNIX directory aliases
<code>.</code> (the current directory) or <code>..</code>
(the parent directory). For example,

<code>google-awesome-project/src/base/logging.h</code>
should be included as:</p>

<pre class="goodcode">#include "base/logging.h"
</pre>

<p>Headers should only be included using an angle-bracketed path if the library
requires you to do so. In particular, the following headers require angle
brackets:</p>

<ul>
<li>C and C++ standard library headers (e.g., <code>&lt;stdlib.h&gt;</code>
  and <code>&lt;string&gt;</code>).</li>
<li>POSIX, Linux, and Windows system headers (e.g., <code>&lt;unistd.h&gt;</code>
  and <code>&lt;windows.h&gt;</code>).</li>
<li>In rare cases, third_party libraries (e.g., <code>&lt;Python.h&gt;</code>).</li>
</ul>

<p>In <code><var>dir/foo</var>.cc</code> or
<code><var>dir/foo_test</var>.cc</code>, whose main
purpose is to implement or test the stuff in
<code><var>dir2/foo2</var>.h</code>, order your includes
as follows:</p>

<ol>
  <li><code><var>dir2/foo2</var>.h</code>.</li>

  <li>A blank line</li>

  <li>C system headers, and any other headers in angle brackets with the
    <code>.h</code> extension, e.g., <code>&lt;unistd.h&gt;</code>,
    <code>&lt;stdlib.h&gt;</code>, <code>&lt;Python.h&gt;</code>.</li>

  <li>A blank line</li>

  <li>C++ standard library headers (without file extension), e.g.,
    <code>&lt;algorithm&gt;</code>, <code>&lt;cstddef&gt;</code>.</li>

  <li>A blank line</li>

  <div>
  <li>Other libraries' <code>.h</code> files.</li>

  <li>A blank line</li>
  </div>

  <li>
  Your project's <code>.h</code>
  files.</li>
</ol>

<p>Separate each non-empty group with one blank line.</p>

<p>With the preferred ordering, if the related header
<code><var>dir2/foo2</var>.h</code> omits any necessary
includes, the build of <code><var>dir/foo</var>.cc</code>
or <code><var>dir/foo</var>_test.cc</code> will break.
Thus, this rule ensures that build breaks show up first
for the people working on these files, not for innocent
people in other packages.</p>

<p><code><var>dir/foo</var>.cc</code> and
<code><var>dir2/foo2</var>.h</code> are usually in the same
directory (e.g., <code>base/basictypes_test.cc</code> and
<code>base/basictypes.h</code>), but may sometimes be in different
directories too.</p>



<p>Note that the C 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>

<p>For example, the includes in

<code>google-awesome-project/src/foo/internal/fooserver.cc</code>
might look like this:</p>

<pre class="goodcode">#include "foo/server/fooserver.h"

#include &lt;sys/types.h&gt;
#include &lt;unistd.h&gt;

#include &lt;string&gt;
#include &lt;vector&gt;

#include "base/basictypes.h"
#include "foo/server/bar.h"
#include "third_party/absl/flags/flag.h"
</pre>

<p><b>Exception:</b></p>

<p>Sometimes, system-specific code needs
conditional includes. Such code can put conditional
includes after other includes. Of course, keep your
system-specific code small and localized. Example:</p>

<pre class="goodcode">#include "foo/public/fooserver.h"

#ifdef _WIN32
#include &lt;windows.h&gt;
#endif  // _WIN32
</pre>

<h2 id="Scoping">Scoping</h2>

<h3 id="Namespaces">Namespaces</h3>

<p>With few exceptions, place code in a namespace. Namespaces
should have unique names based on the project name, and possibly
its path. Do not use <i>using-directives</i> (e.g.,
<code>using namespace foo</code>). Do not use
inline namespaces. For unnamed namespaces, see
<a href="#Internal_Linkage">Internal Linkage</a>.

</p><p class="definition"></p>
<p>Namespaces subdivide the global scope
into distinct, named scopes, and so are useful for preventing
name collisions in the global scope.</p>

<p class="pros"></p>

<p>Namespaces provide a method for preventing name conflicts
in large programs while allowing most code to use reasonably
short names.</p>

<p>For example, if two different projects have a class
<code>Foo</code> in the global scope, these symbols may
collide at compile time or at runtime. If each project
places their code in a namespace, <code>project1::Foo</code>
and <code>project2::Foo</code> are now distinct symbols that
do not collide, and code within each project's namespace
can continue to refer to <code>Foo</code> without the prefix.</p>

<p>Inline namespaces automatically place their names in
the enclosing scope. Consider the following snippet, for
example:</p>

<pre class="neutralcode">namespace outer {
inline namespace inner {
  void foo();
}  // namespace inner
}  // namespace outer
</pre>

<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>

<p class="cons"></p>

<p>Namespaces can be confusing, because they complicate
the mechanics of figuring out what definition a name refers
to.</p>

<p>Inline namespaces, in particular, can be confusing
because names aren't actually restricted to the namespace
where they are declared. They are only useful as part of
some larger versioning policy.</p>

<p>In some contexts, it's necessary to repeatedly refer to
symbols by their fully-qualified names. For deeply-nested
namespaces, this can add a lot of clutter.</p>

<p class="decision"></p>

<p>Namespaces should be used as follows:</p>

<ul>
  <li>Follow the rules on <a href="#Namespace_Names">Namespace Names</a>.
  </li><li>Terminate multi-line namespaces with comments as shown in the given examples.
  </li><li>

  <p>Namespaces wrap the entire source file after
  includes,
  <a href="https://gflags.github.io/gflags/">
  gflags</a> definitions/declarations
  and forward declarations of classes from other namespaces.</p>

<pre class="goodcode">// In the .h file
namespace mynamespace {

// All declarations are within the namespace scope.
// Notice the lack of indentation.
class MyClass {
 public:
  ...
  void Foo();
};

}  // namespace mynamespace
</pre>

<pre class="goodcode">// In the .cc file
namespace mynamespace {

// Definition of functions is within scope of the namespace.
void MyClass::Foo() {
  ...
}

}  // namespace mynamespace
</pre>

  <p>More complex <code>.cc</code> files might have additional details,
  like flags or using-declarations.</p>

<pre class="goodcode">#include "a.h"

ABSL_FLAG(bool, someflag, false, "a flag");

namespace mynamespace {

using ::foo::Bar;

...code for mynamespace...    // Code goes against the left margin.

}  // namespace mynamespace
</pre>
  </li>

  <li>To place generated protocol
  message code in a namespace, use the
  <code>package</code> specifier in the
  <code>.proto</code> file. See


  <a href="https://protobuf.dev/reference/cpp/cpp-generated/#package">
  Protocol Buffer Packages</a>
  for details.</li>

  <li>Do not declare anything in namespace
  <code>std</code>, including forward declarations of
  standard library classes. Declaring entities in
  namespace <code>std</code> is undefined behavior, i.e.,
  not portable. To declare entities from the standard
  library, include the appropriate header file.</li>

  <li><p>You may not use a <i>using-directive</i>
  to make all names from a namespace available.</p>

<pre class="badcode">// Forbidden -- This pollutes the namespace.
using namespace foo;
</pre>
  </li>

  <li><p>Do not use <i>Namespace aliases</i> at namespace scope
  in header files except in explicitly marked
  internal-only namespaces, because anything imported into a namespace
  in a header file becomes part of the public API exported by that file.
  Namespace aliases can be used when those conditions don't apply, but
  they must have <a href="#Naming_Aliases">appropriate names</a>.</p>

<pre class="goodcode">// In a .h file, an alias must not be a separate API, or must be hidden in an
// implementation detail.
namespace librarian {

namespace internal {  // Internal, not part of the API.
namespace sidetable = ::pipeline_diagnostics::sidetable;
}  // namespace internal

inline void my_inline_function() {
  // Local to a function.
  namespace baz = ::foo::bar::baz;
  ...
}

}  // namespace librarian
</pre>

<pre class="goodcode">// Remove uninteresting parts of some commonly used names in .cc files.
namespace sidetable = ::pipeline_diagnostics::sidetable;
</pre>

  </li><li>Do not use inline namespaces.</li>

  <li><p>Use namespaces with "internal" in the name to document parts of an API that
    should not be mentioned by users of the API.
    </p>

<pre class="badcode">// We shouldn't use this internal name in non-absl code.
using ::absl::container_internal::ImplementationDetail;
</pre>

    <p>Note that there is still a risk of collision between libraries within a
    nested <code>internal</code> namespace, so give each library within a
    namespace a unique internal namespace by adding the library's
    filename. For example, <code>gshoe/widget.h</code> would use
    <code>gshoe::internal_widget</code> as opposed to just
    <code>gshoe::internal</code>.</p>
  </li>

  <li><p>Single-line nested namespace declarations

    are preferred in new code, but are not required.</p>
<pre class="goodcode">namespace my_project::my_component {

  ...

}  // namespace my_project::my_component
</pre>
  </li>
</ul>

<a id="Unnamed_Namespaces_and_Static_Variables"></a>
<h3 id="Internal_Linkage">Internal Linkage</h3>

<p>When definitions in a <code>.cc</code> file do not need to be
referenced outside that file, give them internal linkage by placing
them in an unnamed namespace or declaring them <code>static</code>.
Do not use either of these constructs in <code>.h</code> files.

</p><p class="definition"></p>
<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>

<p class="decision"></p>

<p>Use of internal linkage in <code>.cc</code> files is encouraged
for all code that does not need to be referenced elsewhere.
Do not use internal linkage in <code>.h</code> files.</p>

<p>Format unnamed namespaces like named namespaces. In the
  terminating comment, leave the namespace name empty:</p>

<pre class="goodcode">namespace {
...
}  // namespace
</pre>

<h3 id="Nonmember,_Static_Member,_and_Global_Functions">Nonmember, Static Member, and Global Functions</h3>

<p>Prefer placing nonmember functions in a namespace; use completely global
functions rarely. Do not use a class simply to group static members. Static
methods of a class should generally be closely related to instances of the
class or the class's static data.</p>


<p class="pros"></p>
<p>Nonmember and static member functions can be useful in
some situations. Putting nonmember functions in a
namespace avoids polluting the global namespace.</p>

<p class="cons"></p>
<p>Nonmember and static member functions may make more sense
as members of a new class, especially if they access
external resources or have significant dependencies.</p>

<p class="decision"></p>
<p>Sometimes it is useful to define a
function not bound to a class instance. Such a function
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.
Do not create classes only to group static members;
this is no different than just giving the 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
<a href="#Internal_Linkage">internal linkage</a> to limit
its scope.</p>

<h3 id="Local_Variables">Local Variables</h3>

<p>Place a function's variables in the narrowest scope
possible, and initialize variables in the declaration.</p>

<p>C++ allows you to declare variables anywhere in a function.
We encourage you to declare them in a scope as local as
possible, and as close to the first use as possible.
This makes it easier for the reader to find the
declaration and see what type the variable is and what it
was initialized to. In particular, initialization should
be used instead of declaration and assignment, e.g.,:</p>

<pre class="badcode">int i;
i = f();      // Bad -- initialization separate from declaration.
</pre>

<pre class="goodcode">int i = f();  // Good -- declaration has initialization.
</pre>


<pre class="badcode">int jobs = NumJobs();
// More code...
f(jobs);      // Bad -- declaration separate from use.
</pre>

<pre class="goodcode">int jobs = NumJobs();
f(jobs);      // Good -- declaration immediately (or closely) followed by use.
</pre>

<pre class="badcode">std::vector&lt;int&gt; v;
v.push_back(1);  // Prefer initializing using brace initialization.
v.push_back(2);
</pre>

<pre class="goodcode">std::vector&lt;int&gt; v = {1, 2};  // Good -- v starts initialized.
</pre>

<p>Variables needed for <code>if</code>, <code>while</code>
and <code>for</code> statements should normally be declared
within those statements, so that such variables are confined
to those scopes. For example:</p>

<pre class="goodcode">while (const char* p = strchr(str, '/')) str = p + 1;
</pre>

<p>There is one caveat: if the variable is an object, its
constructor is invoked every time it enters scope and is
created, and its destructor is invoked every time it goes
out of scope.</p>

<pre class="badcode">// Inefficient implementation:
for (int i = 0; i &lt; 1000000; ++i) {
  Foo f;  // My ctor and dtor get called 1000000 times each.
  f.DoSomething(i);
}
</pre>

<p>It may be more efficient to declare such a variable
used in a loop outside that loop:</p>

<pre class="goodcode">Foo f;  // My ctor and dtor get called once each.
for (int i = 0; i &lt; 1000000; ++i) {
  f.DoSomething(i);
}
</pre>

<h3 id="Static_and_Global_Variables">Static and Global Variables</h3>

<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>

<p class="definition"></p>
<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>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>

<p class="pros"></p>
<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>

<p class="cons"></p>
<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>

<p class="decision"></p>
<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 class="goodcode">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 std::string kFoo = "foo";

// Bad for the same reason, even though kBar is a reference (the
// rule also applies to lifetime-extended temporary objects).
const std::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 class="goodcode">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>
or <code>constinit</code>.
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="badcode">// Some declarations used below.
time_t time(time_t*);      // Not constexpr!
int f();                   // Not constexpr!
struct Bar { Bar() {} };

// Problematic initializations.
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 class="goodcode">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>



<h4>Common patterns</h4>

<ul>
  <li>Global strings: if you require a named global or static string constant,
    consider using a <code>constexpr</code> variable of
    <code>string_view</code>, character array, or character pointer, pointing
    to a string literal. String literals have static storage duration already
    and are usually sufficient.
    See <a href="https://abseil.io/tips/140">TotW #140</a>.</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); consider using the facilities from
    <a href="https://github.com/abseil/abseil-cpp/blob/master/absl/algorithm/container.h">absl/algorithm/container.h</a>
    for the standard operations. 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>std::unique_ptr</code>, <code>std::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 using a function-local static pointer or reference (e.g.,
    <code>static const auto&amp; impl = *new T(args...);</code>).</li>
</ul>

<h3 id="thread_local">thread_local Variables</h3>

<p><code>thread_local</code> variables that aren't declared inside a function
must be initialized with a true compile-time constant,
and this must be enforced by using the
<a href="https://en.cppreference.com/w/cpp/language/constinit">
  <code>constinit</code></a>
attribute. Prefer
<code>thread_local</code> over other ways of defining thread-local data.</p>

<p class="definition"></p>
<p>Variables can be declared with the
<code>thread_local</code> specifier:</p>
<pre class="neutralcode">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> variables have a subtle destruction-order issue:
during thread shutdown, <code>thread_local</code> variables will be destroyed
in the opposite order of their initialization (as is generally true in C++).
If code triggered by the destructor of any <code>thread_local</code> variable
refers to any already-destroyed <code>thread_local</code> on that thread, we will
get a particularly hard to diagnose use-after-free.</p>

<p class="pros"></p>
<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>

<p class="cons"></p>
<ul>
  <li>Accessing a <code>thread_local</code> variable may trigger execution of
    an unpredictable and uncontrollable amount of other code during thread-start or
    first use on a given thread.</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>Data members cannot be <code>thread_local</code> unless they are also
    <code>static</code>.</li>
  <li>We may suffer from use-after-free bugs if <code>thread_local</code> variables
    have complex destructors. In particular, the destructor of any such variable must not
    call any code (transitively) that refers to any potentially-destroyed
    <code>thread_local</code>. This property is hard to enforce.</li>

  <li>Approaches for avoiding use-after-free in global/static contexts do not work for
    <code>thread_local</code>s. Specifically, skipping destructors for globals and static
    variables is allowable because their lifetimes end at program shutdown. Thus, any "leak"
    is managed immediately by the OS cleaning up our memory and other resources. By
    contrast, skipping destructors for <code>thread_local</code> variables leads to resource
    leaks proportional to the total number of threads that terminate during the lifetime of
    the program.</li>

</ul>

<p class="decision"></p>
  <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). To enforce this, <code>thread_local</code> variables
  at class or namespace scope must be annotated with
  <a href="https://en.cppreference.com/w/cpp/language/constinit">
    <code>constinit</code></a>
  (or <code>constexpr</code>, but that should be rare):</p>

  <pre class="goodcode">   constinit thread_local Foo foo = ...;
  </pre>

  <p><code>thread_local</code> variables inside a function have no initialization
    concerns, but still risk use-after-free during thread exit. 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 class="goodcode">Foo&amp; MyThreadLocalFoo() {
  thread_local Foo result = ComplicatedInitialization();
  return result;
}
</pre>

  <p>Note that <code>thread_local</code> variables will be destroyed whenever a thread exits.
    If the destructor of any such variable refers to any other (potentially-destroyed)
    <code>thread_local</code> we will suffer from hard to diagnose use-after-free bugs.
    Prefer trivial types, or types that provably run no user-provided code at destruction to
    minimize the potential of accessing any other <code>thread_local</code>.
  </p>

<p><code>thread_local</code> should be preferred over other mechanisms for
defining thread-local data.</p>

<h2 id="Classes">Classes</h2>

<p>Classes are the fundamental unit of code in C++. Naturally,
we use them extensively. This section lists the main dos and
don'ts you should follow when writing a class.</p>

<h3 id="Doing_Work_in_Constructors">Doing Work in Constructors</h3>

<p>Avoid virtual method calls in constructors, and avoid
initialization that can fail if you can't signal an error.</p>

<p class="definition"></p>
<p>It is possible to perform arbitrary initialization in the body
of the constructor.</p>

<p class="pros"></p>
<ul>
  <li>No need to worry about whether the class has been initialized or
  not.</li>

  <li>Objects that are fully initialized by constructor call can
  be <code>const</code> and may also be easier to use with standard containers
  or algorithms.</li>
</ul>

<p class="cons"></p>
<ul>
  <li>If the work calls virtual functions, these calls
  will not get dispatched to the subclass
  implementations. Future modification to your class can
  quietly introduce this problem even if your class is
  not currently subclassed, causing much confusion.</li>

  <li>There is no easy way for constructors to signal errors, short of
  crashing the program (not always appropriate) or using exceptions
  (which are <a href="#Exceptions">forbidden</a>).</li>

  <li>If the work fails, we now have an object whose initialization
  code failed, so it may be an unusual state requiring a <code>bool
  IsValid()</code> state checking mechanism (or similar) which is easy
  to forget to call.</li>

  <li>You cannot take the address of a constructor, so whatever work
  is done in the constructor cannot easily be handed off to, for
  example, another thread.</li>
</ul>

<p class="decision"></p>
<p>Constructors should never call virtual functions. If appropriate
for your code ,
terminating the program may be an appropriate error handling
response. Otherwise, consider a factory function
or <code>Init()</code> method as described in
<a href="https://abseil.io/tips/42">TotW #42</a>
.
Avoid <code>Init()</code> methods on objects with
no other states that affect which public methods may be called
(semi-constructed objects of this form are particularly hard to work
with correctly).</p>

<a id="Explicit_Constructors"></a>
<h3 id="Implicit_Conversions">Implicit Conversions</h3>

<p>Do not define implicit conversions. Use the <code>explicit</code>
keyword for conversion operators and single-argument
constructors.</p>

<p class="definition"></p>
<p>Implicit conversions allow an
object of one type (called the <dfn>source type</dfn>) to
be used where a different type (called the <dfn>destination
type</dfn>) is expected, such as when passing an
<code>int</code> argument to a function that takes a
<code>double</code> parameter.</p>

<p>In addition to the implicit conversions defined by the language,
users can define their own, by adding appropriate members to the
class definition of the source or destination type. An implicit
conversion in the source type is defined by a type conversion operator
named after the destination type (e.g., <code>operator
bool()</code>). An implicit conversion in the destination
type is defined by a constructor that can take the source type as
its only argument (or only argument with no default value).</p>

<p>The <code>explicit</code> keyword can be applied to a constructor
or a conversion operator, to ensure that it can only be
used when the destination type is explicit at the point of use,
e.g., with a cast. This applies not only to implicit conversions, but to
list initialization syntax:</p>
<pre class="neutralcode">class Foo {
  explicit Foo(int x, double y);
  ...
};

void Func(Foo f);
</pre>
<pre class="badcode">Func({42, 3.14});  // Error
</pre>
<p>This kind of code isn't technically an implicit conversion, but the
language treats it as one as far as <code>explicit</code> is concerned.</p>

<p class="pros"></p>
<ul>
<li>Implicit conversions can make a type more usable and
    expressive by eliminating the need to explicitly name a type
    when it's obvious.</li>
<li>Implicit conversions can be a simpler alternative to
    overloading, such as when a single
    function with a <code>string_view</code> parameter takes the
    place of separate overloads for <code>std::string</code> and
    <code>const char*</code>.</li>
<li>List initialization syntax is a concise and expressive
    way of initializing objects.</li>
</ul>

<p class="cons"></p>
<ul>
<li>Implicit conversions can hide type-mismatch bugs, where the
    destination type does not match the user's expectation, or
    the user is unaware that any conversion will take place.</li>

<li>Implicit conversions can make code harder to read, particularly
    in the presence of overloading, by making it less obvious what
    code is actually getting called.</li>

<li>Constructors that take a single argument may accidentally
    be usable as implicit type conversions, even if they are not
    intended to do so.</li>

<li>When a single-argument constructor is not marked
    <code>explicit</code>, there's no reliable way to tell whether
    it's intended to define an implicit conversion, or the author
    simply forgot to mark it.</li>

<li>Implicit conversions can lead to call-site ambiguities, especially
    when there are bidirectional implicit conversions. This can be caused
    either by having two types that both provide an implicit conversion,
    or by a single type that has both an implicit constructor and an
    implicit type conversion operator.</li>

<li>List initialization can suffer from the same problems if
    the destination type is implicit, particularly if the
    list has only a single element.</li>
</ul>

<p class="decision"></p>
<p>Type conversion operators, and constructors that are
callable with a single argument, must be marked
<code>explicit</code> in the class definition. As an
exception, copy and move constructors should not be
<code>explicit</code>, since they do not perform type
conversion.</p>

<p>Implicit conversions can sometimes be necessary and appropriate for
types that are designed to be interchangeable, for example when objects
of two types are just different representations of the same underlying
value. In that case, contact
your project leads to request a waiver
of this rule.
</p>

<p>Constructors that cannot be called with a single argument
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>

<h3 id="Copyable_Movable_Types">Copyable and Movable Types</h3>
<a id="Copy_Constructors"></a>

<p>A class's public API must make clear 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>

<p class="definition"></p>
<p>A movable type is one that can be initialized and assigned
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 (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>std::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>std::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>

<p class="pros"></p>
<p>Objects of copyable and movable types can be passed and returned by value,
which makes APIs simpler, safer, and more general. Unlike when passing objects
by pointer or reference, there's no risk of confusion over ownership,
lifetime, mutability, and similar issues, and no need to specify them in the
contract. It also prevents non-local interactions between the client and the
implementation, which makes them easier to understand, maintain, and optimize by
the compiler. Further, such objects can be used with generic APIs that
require pass-by-value, such as most containers, and they allow for additional
flexibility in e.g., type composition.</p>

<p>Copy/move constructors and assignment operators are usually
easier to define correctly than alternatives
like <code>Clone()</code>, <code>CopyFrom()</code> or <code>Swap()</code>,
because they can be generated by the compiler, either implicitly or
with <code>= default</code>.  They are concise, and ensure
that all data members are copied. Copy and move
constructors are also generally more efficient, because they don't
require heap allocation or separate initialization and assignment
steps, and they're eligible for optimizations such as

<a href="http://en.cppreference.com/w/cpp/language/copy_elision">
copy elision</a>.</p>

<p>Move operations allow the implicit and efficient transfer of
resources out of rvalue objects. This allows a plainer coding style
in some cases.</p>

<p class="cons"></p>
<p>Some types do not need to be copyable, and providing copy
operations for such types can be confusing, nonsensical, or outright
incorrect. Types representing singleton objects (<code>Registerer</code>),
objects tied to a specific scope (<code>Cleanup</code>), or closely coupled to
object identity (<code>Mutex</code>) cannot be copied meaningfully.
Copy operations for base class types that are to be used
polymorphically are hazardous, because use of them can lead to
<a href="https://en.wikipedia.org/wiki/Object_slicing">object slicing</a>.
Defaulted or carelessly-implemented copy operations can be incorrect, and the
resulting bugs can be confusing and difficult to diagnose.</p>

<p>Copy constructors are invoked implicitly, which makes the
invocation easy to miss. This may cause confusion for programmers used to
languages where pass-by-reference is conventional or mandatory. It may also
encourage excessive copying, which can cause performance problems.</p>

<p class="decision"></p>

<p>Every class's public interface must make clear 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>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. A
copyable class may also declare move operations in order to support efficient
moves. 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="goodcode">class Copyable {
 public:
  Copyable(const Copyable&amp; other) = default;
  Copyable&amp; operator=(const Copyable&amp; other) = default;

  // The implicit move operations are suppressed by the declarations above.
  // You may explicitly declare move operations to support efficient moves.
};

class MoveOnly {
 public:
  MoveOnly(MoveOnly&amp;&amp; other) = default;
  MoveOnly&amp; operator=(MoveOnly&amp;&amp; other) = default;

  // 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>These declarations/deletions can be omitted only if they are obvious:</p>
<ul>
<li>If the class has no <code>private</code> section, like a
    <a href="#Structs_vs._Classes">struct</a> or an interface-only base class,
    then the copyability/movability can be determined by the
    copyability/movability of any public data members.
</li><li>If a base class clearly isn't copyable or movable, derived classes
    naturally won't be either.  An interface-only base class that leaves these
    operations implicit is not sufficient to make concrete subclasses clear.
</li><li>Note that if you explicitly declare or delete either the constructor or
    assignment operation for copy, the other copy operation is not obvious and
    must be declared or deleted.  Likewise for move operations.
</li></ul>

<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>To eliminate the risk of slicing, prefer to make base classes abstract,
by making their constructors protected, by declaring their destructors protected,
or by giving them one or more pure virtual member functions. Prefer to avoid
deriving from concrete classes.</p>

<h3 id="Structs_vs._Classes">Structs vs. Classes</h3>

<p>Use a <code>struct</code> only for passive objects that
      carry data; everything else is a <code>class</code>.</p>

<p>The <code>struct</code> and <code>class</code>
keywords behave almost identically in C++. We add our own
semantic meanings to each keyword, so you should use the
appropriate keyword for the data-type you're
defining.</p>

<p><code>structs</code> should be used for passive objects that carry
data, and may have associated constants. All fields must be public. The
struct type itself must not have invariants that imply relationships between
different fields, since direct user access to those fields may
break those invariants, but users of a struct may have requirements and
guarantees on particular uses of it. Constructors, destructors, and helper
methods may be present; however, these methods must not require or enforce
any invariants.</p>

<p>If more functionality or invariants are required, or struct has wide visibility and expected to
evolve, then a <code>class</code> is more appropriate. If in doubt, make it a <code>class</code>.
</p>

<p>For consistency with STL, you can use
<code>struct</code> instead of <code>class</code> for
stateless types, such as traits,
<a href="#Template_metaprogramming">template metafunctions</a>,
and some functors.</p>

<p>Note that member variables in structs and classes have
<a href="#Variable_Names">different naming rules</a>.</p>

<h3 id="Structs_vs._Tuples">Structs vs. Pairs and Tuples</h3>

<p>Prefer to use a <code>struct</code> instead of a pair or a
tuple whenever the elements can have meaningful names.</p>

<p>
  While using pairs and tuples can avoid the need to define a custom type,
  potentially saving work when <em>writing</em> code, a meaningful field
  name will almost always be much clearer when <em>reading</em> code than
  <code>.first</code>, <code>.second</code>, or <code>std::get&lt;X&gt;</code>.
  While C++14's introduction of <code>std::get&lt;Type&gt;</code> to access a
  tuple element by type rather than index (when the type is unique) can
  sometimes partially mitigate this, a field name is usually substantially
  clearer and more informative than a type.
</p>

<p>
  Pairs and tuples may be appropriate in generic code where there are not
  specific meanings for the elements of the pair or tuple. Their use may
  also be required in order to interoperate with existing code or APIs.
</p>

<a id="Multiple_Inheritance"></a>
<h3 id="Inheritance">Inheritance</h3>

<p>Composition is often more appropriate than inheritance.
When using inheritance, make it <code>public</code>.</p>

<p class="definition"></p>
<p> When a sub-class
inherits from a base class, it includes the definitions
of all the data and operations that the base class
defines. "Interface inheritance" is inheritance from a
pure abstract base class (one with no state or defined
methods); all other inheritance is "implementation
inheritance".</p>

<p class="pros"></p>
<p>Implementation inheritance reduces code size by re-using
the base class code as it specializes an existing type.
Because inheritance is a compile-time declaration, you
and the compiler can understand the operation and detect
errors. Interface inheritance can be used to
programmatically enforce that a class expose a particular
API. Again, the compiler can detect errors, in this case,
when a class does not define a necessary method of the
API.</p>

<p class="cons"></p>
<p>For implementation inheritance, because the code
implementing a sub-class is spread between the base and
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.</p>

<p>Multiple inheritance is especially problematic, because
it often imposes a higher performance overhead (in fact,
the performance drop from single inheritance to multiple
inheritance can often be greater than the performance
drop from ordinary to virtual dispatch), and because
it risks leading to "diamond" inheritance patterns,
which are prone to ambiguity, confusion, and outright bugs.</p>

<p class="decision"></p>

<p>All inheritance should be <code>public</code>. If you
want to do private inheritance, you should be including
an instance of the base class as a member instead. You may use
<code>final</code> on classes when you don't intend to support using
them as base classes.</p>

<p>Do not overuse implementation inheritance. Composition
is often more appropriate. Try to restrict use of
inheritance to the "is-a" case: <code>Bar</code>
subclasses <code>Foo</code> if it can reasonably be said
that <code>Bar</code> "is a kind of"
<code>Foo</code>.</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 <code>private</code></a>.</p>

<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
not compile, and this helps catch common errors. The
specifiers serve as documentation; if no specifier is
present, the reader has to check all ancestors of the
class in question to determine if the function or
destructor is virtual or not.</p>

<p>Multiple inheritance is permitted, but multiple <em>implementation</em>
inheritance is strongly discouraged.</p>

<h3 id="Operator_Overloading">Operator Overloading</h3>

<p>Overload operators judiciously. Do not use user-defined literals.</p>

<p class="definition"></p>
<p>C++ permits user code to
<a href="http://en.cppreference.com/w/cpp/language/operators">declare
overloaded versions of the built-in operators</a> using the
<code>operator</code> keyword, so long as one of the parameters
is a user-defined type. The <code>operator</code> keyword also
permits user code to define new kinds of literals using
<code>operator""</code>, and to define type-conversion functions
such as <code>operator bool()</code>.</p>

<p class="pros"></p>
<p>Operator overloading can make code more concise and
intuitive by enabling user-defined types to behave the same
as built-in types. Overloaded operators are the idiomatic names
for certain operations (e.g., <code>==</code>, <code>&lt;</code>,
<code>=</code>, and <code>&lt;&lt;</code>), and adhering to
those conventions can make user-defined types more readable
and enable them to interoperate with libraries that expect
those names.</p>

<p>User-defined literals are a very concise notation for
creating objects of user-defined types.</p>

<p class="cons"></p>
<ul>
  <li>Providing a correct, consistent, and unsurprising
  set of operator overloads requires some care, and failure
  to do so can lead to confusion and bugs.</li>

  <li>Overuse of operators can lead to obfuscated code,
  particularly if the overloaded operator's semantics
  don't follow convention.</li>

  <li>The hazards of function overloading apply just as
  much to operator overloading, if not more so.</li>

  <li>Operator overloads can fool our intuition into
  thinking that expensive operations are cheap, built-in
  operations.</li>

  <li>Finding the call sites for overloaded operators may
  require a search tool that's aware of C++ syntax, rather
  than, e.g., grep.</li>

  <li>If you get the argument type of an overloaded operator
  wrong, you may get a different overload rather than a
  compiler error. For example, <code>foo &lt; bar</code>
  may do one thing, while <code>&amp;foo &lt; &amp;bar</code>
  does something totally different.</li>

  <li>Certain operator overloads are inherently hazardous.
  Overloading unary <code>&amp;</code> can cause the same
  code to have different meanings depending on whether
  the overload declaration is visible. Overloads of
  <code>&amp;&amp;</code>, <code>||</code>, and <code>,</code>
  (comma) cannot match the evaluation-order semantics of the
  built-in operators.</li>

  <li>Operators are often defined outside the class,
  so there's a risk of different files introducing
  different definitions of the same operator. If both
  definitions are linked into the same binary, this results
  in undefined behavior, which can manifest as subtle
  run-time bugs.</li>

  <li>User-defined literals (UDLs) allow the creation of new
  syntactic forms that are unfamiliar even to experienced C++
  programmers, such as <code>"Hello World"sv</code> as a
  shorthand for <code>std::string_view("Hello World")</code>.
  Existing notations are clearer, though less terse.</li>

  <li>Because they can't be namespace-qualified, uses of UDLs also require
  use of either using-directives (which <a href="#Namespaces">we ban</a>) or
  using-declarations (which <a href="#Aliases">we ban in header files</a> except
  when the imported names are part of the interface exposed by the header
  file in question).  Given that header files would have to avoid UDL
  suffixes, we prefer to avoid having conventions for literals differ
  between header files and source files.
  </li>
</ul>

<p class="decision"></p>
<p>Define overloaded operators only if their meaning is
obvious, unsurprising, and consistent with the corresponding
built-in operators. For example, use <code>|</code> as a
bitwise- or logical-or, not as a shell-style pipe.</p>

<p>Define operators only on your own types. More precisely,
define them in the same headers, <code>.cc</code> files, and namespaces
as the types they operate on. That way, the operators are available
wherever the type is, minimizing the risk of multiple
definitions. If possible, avoid defining operators as templates,
because they must satisfy this rule for any possible template
arguments. If you define an operator, also define
any related operators that make sense, and make sure they
are defined consistently.</p>

<p>Prefer to define non-modifying binary operators as
non-member functions. If a binary operator is defined as a
class member, implicit conversions will apply to the
right-hand argument, but not the left-hand one. It will
confuse your users if <code>a + b</code> compiles but
<code>b + a</code> doesn't.</p>

<p>For a type <code>T</code> whose values can be compared for
equality, define a non-member <code>operator==</code> and document when
two values of type <code>T</code> are considered equal.
If there is a single obvious notion of when a value <code>t1</code>
of type <code>T</code> is less than another such value <code>t2</code> then
you may also define <code>operator&lt;=&gt;</code>, which should be
consistent with <code>operator==</code>.
Prefer not to overload the other comparison and ordering operators.</p>

<p>Don't go out of your way to avoid defining operator
overloads. For example, prefer to define <code>==</code>,
<code>=</code>, and <code>&lt;&lt;</code>, rather than
<code>Equals()</code>, <code>CopyFrom()</code>, and
<code>PrintTo()</code>. Conversely, don't define
operator overloads just because other libraries expect
them. For example, if your type doesn't have a natural
ordering, but you want to store it in a <code>std::set</code>,
use a custom comparator rather than overloading
<code>&lt;</code>.</p>

<p>Do not overload <code>&amp;&amp;</code>, <code>||</code>,
<code>,</code> (comma), or unary <code>&amp;</code>. Do not overload
<code>operator""</code>, i.e., do not introduce user-defined
literals.  Do not use any such literals provided by others
(including the standard library).</p>

<p>Type conversion operators are covered in the section on
<a href="#Implicit_Conversions">implicit conversions</a>.
The <code>=</code> operator is covered in the section on
<a href="#Copy_Constructors">copy constructors</a>. Overloading
<code>&lt;&lt;</code> for use with streams is covered in the
section on <a href="#Streams">streams</a>. See also the rules on
<a href="#Function_Overloading">function overloading</a>, which
apply to operator overloading as well.</p>

<h3 id="Access_Control">Access Control</h3>

<p>Make classes' data members <code>private</code>, unless they are
<a href="#Constant_Names">constants</a>. This simplifies reasoning about invariants, at the cost
of some easy boilerplate in the form of accessors (usually <code>const</code>) if necessary.</p>

<p>For technical
reasons, we allow data members of a test fixture class defined in a <code>.cc</code> file to
be <code>protected</code> when using


<a href="https://github.com/google/googletest">Google
Test</a>.
If a test fixture class is defined outside of the <code>.cc</code> file it is used in, for example
in a <code>.h</code> file, make data members <code>private</code>.</p>

<h3 id="Declaration_Order">Declaration Order</h3>

<p>Group similar declarations together, placing <code>public</code> parts
earlier.</p>

<p>A class definition should usually start with a
<code>public:</code> section, followed by
<code>protected:</code>, then <code>private:</code>.  Omit
sections that would be empty.</p>

<p>Within each section, prefer grouping similar
kinds of declarations together, and prefer the
following order:</p>

<ol>
  <li>Types and type aliases (<code>typedef</code>, <code>using</code>,
    <code>enum</code>, nested structs and classes, and <code>friend</code> types)</li>

  <li>(Optionally, for structs only) non-<code>static</code> data members</li>

  <li>Static constants</li>

  <li>Factory functions</li>

  <li>Constructors and assignment operators</li>

  <li>Destructor</li>

  <li>
    All other functions (<code>static</code> and non-<code>static</code> member
    functions, and <code>friend</code> functions)
  </li>

  <li>All other data members (static and non-static)</li>
</ol>

<p>Do not put large method definitions inline in the
class definition. Usually, only trivial or
performance-critical, and very short, methods may be
defined inline. See <a href="#Defining_Functions_in_Header_Files">Defining
Functions in Header Files</a> for more details.</p>

<h2 id="Functions">Functions</h2>

<a id="Function_Parameter_Ordering"></a>
<a id="Output_Parameters"></a>
<h3 id="Inputs_and_Outputs">Inputs and Outputs</h3>

<p>The output of a C++ function is naturally provided via
a return value and sometimes via output parameters (or in/out parameters).</p>

<p>Prefer using return values over output parameters:
they improve readability, and often provide the same or better performance.
See
<a href="https://abseil.io/tips/176">TotW #176</a>.</p>

<p>Prefer to return by value or, failing that, return by reference.
Avoid returning a raw pointer unless it can be null.</p>

<p>Parameters are either inputs to the function, outputs from the
function, or both. Non-optional input parameters should usually be values
or <code>const</code> references, while non-optional output and
input/output parameters should usually be references (which cannot be null).
Generally, use <code>std::optional</code> to represent optional by-value
inputs, and use a <code>const</code> pointer when the non-optional form would
have used a reference. Use non-<code>const</code> pointers to represent
optional outputs and optional input/output parameters.</p>



<p>
Avoid defining functions that require a reference parameter to outlive the call.
In some cases reference parameters can bind to temporaries, leading to lifetime
bugs. Instead, find a way to eliminate the lifetime requirement
(for example, by copying the parameter), or pass retained parameters by
pointer and document the lifetime and non-null requirements.
See <a href="https://abseil.io/tips/116">TotW 116</a> for more.</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. This is not a hard-and-fast rule. Parameters that
are both input and output muddy the waters, and, as always,
consistency with related functions may require you to bend the rule.
Variadic functions may also require unusual parameter ordering.</p>

<h3 id="Write_Short_Functions">Write Short Functions</h3>

<p>Prefer small and focused functions.</p>

<p>We recognize that long functions are sometimes
appropriate, so no hard limit is placed on functions
length. If a function exceeds about 40 lines, think about
whether it can be broken up without harming the structure
of the program.</p>

<p>Even if your long function works perfectly now,
someone modifying it in a few months may add new
behavior. This could result in bugs that are hard to
find. Keeping your functions short and simple makes it
easier for other people to read and modify your code.
Small functions are also easier to test.</p>

<p>You could find long and complicated functions when
working with
some code. Do not be
intimidated by modifying existing code: if working with
such a function proves to be difficult, you find that
errors are hard to debug, or you want to use a piece of
it in several different contexts, consider breaking up
the function into smaller and more manageable pieces.</p>

<h3 id="Function_Overloading">Function Overloading</h3>

<p>Use overloaded functions (including constructors) only if a
reader looking at a call site can get a good idea of what
is happening without having to first figure out exactly
which overload is being called.</p>

<p class="definition"></p>
<p>You may write a function that takes a <code>const
std::string&amp;</code> and overload it with another that
takes <code>const char*</code>. However, in this case consider
<code>std::string_view
</code>
instead.</p>

<pre class="neutralcode">class MyClass {
 public:
  void Analyze(const std::string&amp; text);
  void Analyze(const char* text, size_t textlen);
};
</pre>

<p class="pros"></p>
<p>Overloading can make code more intuitive by allowing an
identically-named function to take different arguments.
It may be necessary for templatized code, and it can be
convenient for Visitors.</p>
<p>Overloading based on <code>const</code> or ref qualification
may make utility code more usable, more efficient, or both.
See <a href="https://abseil.io/tips/148">TotW #148</a> for more.</p>

<p class="cons"></p>
<p>If a function is overloaded by the argument types alone,
a reader may have to understand C++'s complex matching
rules in order to tell what's going on. Also many people
are confused by the semantics of inheritance if a derived
class overrides only some of the variants of a
function.</p>

<p class="decision"></p>
<p>You may overload a function when there are no semantic differences
between variants. These overloads may vary in types, qualifiers, or
argument count. However, a reader of such a call must not need to know
which member of the overload set is chosen, only that <b>something</b>
from the set is being called.</p>

<p>To reflect this unified design, prefer a single, comprehensive "umbrella"
comment that documents the entire overload set and is placed before the first
declaration.</p>

<p>Where a reader might have difficulty connecting the umbrella
comment to a specific overload, it's okay to have a comment for specific overloads.</p>

<h3 id="Default_Arguments">Default Arguments</h3>

<p>Default arguments are allowed on non-virtual functions
when the default is guaranteed to always have the same
value. Follow the same restrictions as for <a href="#Function_Overloading">function overloading</a>, and
prefer overloaded functions if the readability gained with
default arguments doesn't outweigh the downsides below.</p>

<p class="pros"></p>
<p>Often you have a function that uses default values, but
occasionally you want to override the defaults. Default
parameters allow an easy way to do this without having to
define many functions for the rare exceptions. Compared
to overloading the function, default arguments have a
cleaner syntax, with less boilerplate and a clearer
distinction between 'required' and 'optional'
arguments.</p>

<p class="cons"></p>
<p>Defaulted arguments are another way to achieve the
semantics of overloaded functions, so all the <a href="#Function_Overloading">reasons not to overload
functions</a> apply.</p>

<p>The defaults for arguments in a virtual function call are
determined by the static type of the target object, and
there's no guarantee that all overrides of a given function
declare the same defaults.</p>

<p>Default parameters are re-evaluated at each call site,
which can bloat the generated code. Readers may also expect
the default's value to be fixed at the declaration instead
of varying at each call.</p>

<p>Function pointers are confusing in the presence of
default arguments, since the function signature often
doesn't match the call signature. Adding
function overloads avoids these problems.</p>

<p class="decision"></p>
<p>Default arguments are banned on virtual functions, where
they don't work properly, and in cases where the specified
default might not evaluate to the same value depending on
when it was evaluated. (For example, don't write <code>void
f(int n = counter++);</code>.)</p>

<p>In some other cases, default arguments can improve the
readability of their function declarations enough to
overcome the downsides above, so they are allowed. When in
doubt, use overloads.</p>

<h3 id="trailing_return">Trailing Return Type Syntax</h3>

<p>Use trailing return types only where using the ordinary syntax (leading
  return types) is impractical or much less readable.</p>

<p class="definition"></p>
<p>C++ allows two different forms of function declarations. In the older
  form, the return type appears before the function name. For example:</p>
<pre class="neutralcode">int Foo(int x);
</pre>
<p>The newer form uses the <code>auto</code>
  keyword before the function name and a trailing return type after
  the argument list. For example, the declaration above could
  equivalently be written:</p>
<pre class="neutralcode">auto Foo(int x) -&gt; int;
</pre>
<p>The trailing return type is in the function's scope. This doesn't
  make a difference for a simple case like <code>int</code> but it matters
  for more complicated cases, like types declared in class scope or
  types written in terms of the function parameters.</p>

<p class="pros"></p>
<p>Trailing return types are the only way to explicitly specify the
  return type of a <a href="#Lambda_expressions">lambda expression</a>.
  In some cases the compiler is able to deduce a lambda's return type,
  but not in all cases. Even when the compiler can deduce it automatically,
  sometimes specifying it explicitly would be clearer for readers.
</p>
<p>Sometimes it's easier and more readable to specify a return type
  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 class="neutralcode">    template &lt;typename T, typename U&gt;
    auto Add(T t, U u) -&gt; decltype(t + u);
  </pre>
  versus
  <pre class="neutralcode">    template &lt;typename T, typename U&gt;
    decltype(declval&lt;T&amp;&gt;() + declval&lt;U&amp;&gt;()) Add(T t, U u);
  </pre>

<p class="cons"></p>
<p>Trailing return type syntax has no analogue in C++-like languages
  such as C and Java, so some readers may find it unfamiliar.</p>
<p>Existing codebases have an enormous number of function
  declarations that aren't going to get changed to use the new syntax,
  so the realistic choices are using the old syntax only or using a mixture
  of the two. Using a single version is better for uniformity of style.</p>

<p class="decision"></p>
<p>In most cases, continue to use the older style of function
  declaration where the return type goes before the function name.
  Use the new trailing-return-type form only in cases where it's
  required (such as lambdas) or where, by putting the type after the
  function's parameter list, it allows you to write the type in a much
  more readable way. The latter case should be rare; it's mostly an
  issue in fairly complicated template code, which is
  <a href="#Template_metaprogramming">discouraged in most cases</a>.</p>


<h2 id="Google-Specific_Magic">Google-Specific Magic</h2>



<div>
<p>There are various tricks and utilities that
we use to make C++ code more robust, and various ways we use
C++ that may differ from what you see elsewhere.</p>
</div>



<h3 id="Ownership_and_Smart_Pointers">Ownership and Smart Pointers</h3>

<p>Prefer to have single, fixed owners for dynamically
allocated objects. Prefer to transfer ownership with smart
pointers.</p>

<p class="definition"></p>
<p>"Ownership" is a bookkeeping technique for managing
dynamically allocated memory (and other resources). The
owner of a dynamically allocated object is an object or
function that is responsible for ensuring that it is
deleted when no longer needed. Ownership can sometimes be
shared, in which case the last owner is typically
responsible for deleting it. Even when ownership is not
shared, it can be transferred from one piece of code to
another.</p>

<p>"Smart" pointers are classes that act like pointers,
e.g., by overloading the <code>*</code> and
<code>-&gt;</code> operators. Some smart pointer types
can be used to automate ownership bookkeeping, to ensure
these responsibilities are met.
<a href="http://en.cppreference.com/w/cpp/memory/unique_ptr">
<code>std::unique_ptr</code></a> is a smart pointer type
which expresses exclusive ownership
of a dynamically allocated object; the object is deleted
when the <code>std::unique_ptr</code> goes out of scope.
It cannot be copied, but can be <em>moved</em> to
represent ownership transfer.
<a href="http://en.cppreference.com/w/cpp/memory/shared_ptr">
<code>std::shared_ptr</code></a> is a smart pointer type
that expresses shared ownership of
a dynamically allocated object. <code>std::shared_ptr</code>s
can be copied; ownership of the object is shared among
all copies, and the object is deleted when the last
<code>std::shared_ptr</code> is destroyed. </p>

<p class="pros"></p>
<ul>
  <li>It's virtually impossible to manage dynamically
  allocated memory without some sort of ownership
  logic.</li>

  <li>Transferring ownership of an object can be cheaper
  than copying it (if copying it is even possible).</li>

  <li>Transferring ownership can be simpler than
  'borrowing' a pointer or reference, because it reduces
  the need to coordinate the lifetime of the object
  between the two users.</li>

  <li>Smart pointers can improve readability by making
  ownership logic explicit, self-documenting, and
  unambiguous.</li>

  <li>Smart pointers can eliminate manual ownership
  bookkeeping, simplifying the code and ruling out large
  classes of errors.</li>

  <li>For <code>const</code> objects, shared ownership can be a simple
  and efficient alternative to deep copying.</li>
</ul>

<p class="cons"></p>
<ul>
  <li>Ownership must be represented and transferred via
  pointers (whether smart or plain). Pointer semantics
  are more complicated than value semantics, especially
  in APIs: you have to worry not just about ownership,
  but also aliasing, lifetime, and mutability, among
  other issues.</li>

  <li>The performance costs of value semantics are often
  overestimated, so the performance benefits of ownership
  transfer might not justify the readability and
  complexity costs.</li>

  <li>APIs that transfer ownership force their clients
  into a single memory management model.</li>

  <li>Code using smart pointers is less explicit about
  where the resource releases take place.</li>

  <li><code>std::unique_ptr</code> expresses ownership
  transfer using move semantics, which can be complex and
  may confuse some programmers.</li>

  <li>Shared ownership can be a tempting alternative to
  careful ownership design, obfuscating the design of a
  system.</li>

  <li>Shared ownership requires explicit bookkeeping at
  run-time, which can be costly.</li>

  <li>In some cases (e.g., cyclic references), objects
  with shared ownership may never be deleted.</li>

  <li>Smart pointers are not perfect substitutes for
  plain pointers.</li>
</ul>

<p class="decision"></p>
<p>If dynamic allocation is necessary, prefer to keep
ownership with the code that allocated it. If other code
needs access to the object, consider passing it a copy,
or passing a pointer or reference without transferring
ownership. Prefer to use <code>std::unique_ptr</code> to
make ownership transfer explicit. For example:</p>

<pre class="goodcode">std::unique_ptr&lt;Foo&gt; FooFactory();
void FooConsumer(std::unique_ptr&lt;Foo&gt; ptr);
</pre>



<p>Do not design your code to use shared ownership
without a very good reason. One such reason is to avoid
expensive copy operations, but you should only do this if
the performance benefits are significant, and the
underlying object is immutable (i.e.,
<code>std::shared_ptr&lt;const Foo&gt;</code>).  If you
do use shared ownership, prefer to use
<code>std::shared_ptr</code>.</p>

<p>Never use <code>std::auto_ptr</code>. Instead, use
<code>std::unique_ptr</code>.</p>

<h3 id="cpplint">cpplint</h3>

<p>Use <code>cpplint.py</code> to detect style errors.</p>

<p><code>cpplint.py</code>
is a tool that reads a source file and identifies many
style errors. It is not perfect, and has both false
positives and false negatives, but it is still a valuable
tool. </p>



<div>
<p>Some projects have instructions on
how to run <code>cpplint.py</code> from their project
tools. If the project you are contributing to does not,
you can download
<a href="https://raw.githubusercontent.com/cpplint/cpplint/HEAD/cpplint.py">
<code>cpplint.py</code></a> separately.</p>
</div>



<h2 id="Other_C++_Features">Other C++ Features</h2>

<h3 id="Rvalue_references">Rvalue References</h3>

<p>Use rvalue references only in certain special cases listed below.</p>

<p class="definition"></p>
<p> Rvalue references
are a type of reference that can only bind to temporary
objects. The syntax is similar to traditional reference
syntax. For example, <code>void f(std::string&amp;&amp;
s);</code> declares a function whose argument is an
rvalue reference to a <code>std::string</code>.</p>

<p id="Forwarding_references"> When the token '&amp;&amp;' is applied to
an unqualified template argument in a function
parameter, special template argument deduction
rules apply. Such a reference is called a forwarding reference.</p>

<p class="pros"></p>
<ul>
  <li>Defining a move constructor (a constructor taking
  an rvalue reference to the class type) makes it
  possible to move a value instead of copying it. If
  <code>v1</code> is a <code>std::vector&lt;std::string&gt;</code>,
  for example, then <code>auto v2(std::move(v1))</code>
  will probably just result in some simple pointer
  manipulation instead of copying a large amount of data.
  In many cases this can result in a major performance
  improvement.</li>

  <li>Rvalue references make it possible to implement
  types that are movable but not copyable, which can be
  useful for types that have no sensible definition of
  copying but where you might still want to pass them as
  function arguments, put them in containers, etc.</li>

  <li><code>std::move</code> is necessary to make
  effective use of some standard-library types, such as
  <code>std::unique_ptr</code>.</li>

  <li><a href="#Forwarding_references">Forwarding references</a> which
  use the rvalue reference token make it possible to write a
  generic function wrapper that forwards its arguments to
  another function, and works whether or not its
  arguments are temporary objects and/or const.
  This is called 'perfect forwarding'.</li>
</ul>

<p class="cons"></p>
<ul>
  <li>Rvalue references are not yet widely understood. Rules like reference
  collapsing and the special deduction rule for forwarding references
  are somewhat obscure.</li>

  <li>Rvalue references are often misused. Using rvalue
  references is counter-intuitive in signatures where the argument is expected
  to have a valid specified state after the function call, or where no move
  operation is performed.</li>
</ul>

<p class="decision"></p>
<p>Do not use rvalue references (or apply the <code>&amp;&amp;</code>
qualifier to methods), except as follows:</p>
<ul>
  <li>You may use them to define move constructors and move assignment
  operators (as described in
  <a href="#Copyable_Movable_Types">Copyable and Movable Types</a>).
  </li>

  <li>You may use them to define <code>&amp;&amp;</code>-qualified methods that
  logically "consume" <code>*this</code>, leaving it in an unusable
  or empty state. Note that this applies only to method qualifiers (which come
  after the closing parenthesis of the function signature); if you want to
  "consume" an ordinary function parameter, prefer to pass it by value.</li>

  <li>You may use forwarding references in conjunction with <code>
  <a href="http://en.cppreference.com/w/cpp/utility/forward">std::forward</a></code>,
  to support perfect forwarding.</li>

  <li>You may use them to define pairs of overloads, such as one taking
  <code>Foo&amp;&amp;</code> and the other taking <code>const Foo&amp;</code>.
  Usually the preferred solution is just to pass by value, but an overloaded
  pair of functions sometimes yields better performance, for example if the
  functions sometimes don't consume the input. As always: if you're writing
  more complicated code for the sake of performance, make sure you have evidence
  that it actually helps.</li>
</ul>

<h3 id="Friends">Friends</h3>

<p>We allow use of <code>friend</code> classes and functions,
within reason.</p>

<p>Friends should usually be defined in the same file so
that the reader does not have to look in another file to
find uses of the private members of a class. A common use
of <code>friend</code> is to have a
<code>FooBuilder</code> class be a friend of
<code>Foo</code> so that it can construct the inner state
of <code>Foo</code> correctly, without exposing this
state to the world. In some cases it may be useful to
make a unit test class a friend of the class it tests.</p>

<p>Friends extend, but do not break, the encapsulation
boundary of a class. In some cases this is better than
making a member <code>public</code> when you want to give only one
other class access to it. However, most classes should
interact with other classes solely through their public
members.</p>

<h3 id="Exceptions">Exceptions</h3>

<p>We do not use C++ exceptions.</p>

<p class="pros"></p>
<ul>
  <li>Exceptions allow higher levels of an application to
  decide how to handle "can't happen" failures in deeply
  nested functions, without the obscuring and error-prone
  bookkeeping of error codes.</li>



  <div>
  <li>Exceptions are used by most other
  modern languages. Using them in C++ would make it more
  consistent with Python, Java, and the C++ that others
  are familiar with.</li>
  </div>

  <li>Some third-party C++ libraries use exceptions, and
  turning them off internally makes it harder to
  integrate with those libraries.</li>

  <li>Exceptions are the only way for a constructor to
  fail. We can simulate this with a factory function or
  an <code>Init()</code> method, but these require heap
  allocation or a new "invalid" state, respectively.</li>

  <li>Exceptions are really handy in testing
  frameworks.</li>
</ul>

<p class="cons"></p>
<ul>
  <li>When you add a <code>throw</code> statement to an
  existing function, you must examine all of its
  transitive callers. Either they must make at least the
  basic exception safety guarantee, or they must never
  catch the exception and be happy with the program
  terminating as a result. For instance, if
  <code>f()</code> calls <code>g()</code> calls
  <code>h()</code>, and <code>h</code> throws an
  exception that <code>f</code> catches, <code>g</code>
  has to be careful or it may not clean up properly.</li>

  <li>More generally, exceptions make the control flow of
  programs difficult to evaluate by looking at code:
  functions may return in places you don't expect. This
  causes maintainability and debugging difficulties. You
  can minimize this cost via some rules on how and where
  exceptions can be used, but at the cost of more that a
  developer needs to know and understand.</li>

  <li>Exception safety requires both RAII and different
  coding practices. Lots of supporting machinery is
  needed to make writing correct exception-safe code
  easy. Further, to avoid requiring readers to understand
  the entire call graph, exception-safe code must isolate
  logic that writes to persistent state into a "commit"
  phase. This will have both benefits and costs (perhaps
  where you're forced to obfuscate code to isolate the
  commit). Allowing exceptions would force us to always
  pay those costs even when they're not worth it.</li>

  <li>Turning on exceptions adds data to each binary
  produced, increasing compile time (probably slightly)
  and possibly increasing address space pressure.
  </li>

  <li>The availability of exceptions may encourage
  developers to throw them when they are not appropriate
  or recover from them when it's not safe to do so. For
  example, invalid user input should not cause exceptions
  to be thrown. We would need to make the style guide
  even longer to document these restrictions!</li>
</ul>

<p class="decision"></p>
<p>On their face, the benefits of using exceptions
outweigh the costs, especially in new projects. However,
for existing code, the introduction of exceptions has
implications on all dependent code. If exceptions can be
propagated beyond a new project, it also becomes
problematic to integrate the new project into existing
exception-free code. Because most existing C++ code at
Google is not prepared to deal with exceptions, it is
comparatively difficult to adopt new code that generates
exceptions.</p>

<p>Given that Google's existing code is not
exception-tolerant, the costs of using exceptions are
somewhat greater than the costs in a new project. The
conversion process would be slow and error-prone. We
don't believe that the available alternatives to
exceptions, such as error codes and assertions, introduce
a significant burden. </p>

<p>Our advice against using exceptions is not predicated
on philosophical or moral grounds, but practical ones.
 Because we'd like to use our open-source
projects at Google and it's difficult to do so if those
projects use exceptions, we need to advise against
exceptions in Google open-source projects as well.
Things would probably be different if we had to do it all
over again from scratch.</p>

<p>This prohibition also applies to exception handling related
features 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>

<h3 id="noexcept"><code>noexcept</code></h3>

<p>Specify <code>noexcept</code> when it is useful and correct.</p>

<p class="definition"></p>
<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>

<p class="pros"></p>
<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>

<p class="cons"></p>
<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>

<p class="decision"></p>
<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'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't support hash
functions throwing and make it unconditionally
<code>noexcept</code>.</p>

<h3 id="Run-Time_Type_Information__RTTI_">Run-Time Type
Information (RTTI)</h3>

<p>Avoid using run-time type information (RTTI).</p>

<p class="definition"></p>
<p> RTTI allows a
programmer to query the C++ class of an object at
run-time. This is done by use of <code>typeid</code> or
<code>dynamic_cast</code>.</p>

<p class="pros"></p>
<p>The standard alternatives to RTTI (described below)
require modification or redesign of the class hierarchy
in question. Sometimes such modifications are infeasible
or undesirable, particularly in widely-used or mature
code.</p>

<p>RTTI can be useful in some unit tests. For example, it
is useful in tests of factory classes where the test has
to verify that a newly created object has the expected
dynamic type. It is also useful in managing the
relationship between objects and their mocks.</p>

<p>RTTI is useful when considering multiple abstract
objects. Consider</p>

<pre class="neutralcode">bool Base::Equal(Base* other) = 0;
bool Derived::Equal(Base* other) {
  Derived* that = dynamic_cast&lt;Derived*&gt;(other);
  if (that == nullptr)
    return false;
  ...
}
</pre>

<p class="cons"></p>
<p>Querying the type of an object at run-time frequently
means a design problem. Needing to know the type of an
object at runtime is often an indication that the design
of your class hierarchy is flawed.</p>

<p>Undisciplined use of RTTI makes code hard to maintain.
It can lead to type-based decision trees or switch
statements scattered throughout the code, all of which
must be examined when making further changes.</p>

<p class="decision"></p>
<p>RTTI has legitimate uses but is prone to abuse, so you
must be careful when using it. You may use it freely in
unit tests, but avoid it when possible in other code. In
particular, think twice before using RTTI in new code. If
you find yourself needing to write code that behaves
differently based on the class of an object, consider one
of the following alternatives to querying the type:</p>

<ul>
  <li>Virtual methods are the preferred way of executing
  different code paths depending on a specific subclass
  type. This puts the work within the object itself.</li>

  <li>If the work belongs outside the object and instead
  in some processing code, consider a double-dispatch
  solution, such as the Visitor design pattern. This
  allows a facility outside the object itself to
  determine the type of class using the built-in type
  system.</li>
</ul>

<p>When the logic of a program guarantees that a given
instance of a base class is in fact an instance of a
particular derived class, then a
<code>dynamic_cast</code> may be used freely on the
object.  Usually one
can use a <code>static_cast</code> as an alternative in
such situations.</p>

<p>Decision trees based on type are a strong indication
that your code is on the wrong track.</p>

<pre class="badcode">if (typeid(*data) == typeid(D1)) {
  ...
} else if (typeid(*data) == typeid(D2)) {
  ...
} else if (typeid(*data) == typeid(D3)) {
...
</pre>

<p>Code such as this usually breaks when additional
subclasses are added to the class hierarchy. Moreover,
when properties of a subclass change, it is difficult to
find and modify all the affected code segments.</p>

<p>Do not hand-implement an RTTI-like workaround. The
arguments against RTTI apply just as much to workarounds
like class hierarchies with type tags. Moreover,
workarounds disguise your true intent.</p>

<h3 id="Casting">Casting</h3>

<p>Use C++-style casts
like <code>static_cast&lt;float&gt;(double_value)</code>, or brace
initialization for conversion of arithmetic types like
<code>int64_t y = int64_t{1} &lt;&lt; 42</code>. Do not use
cast formats like <code>(int)x</code> unless the cast is to
<code>void</code>. You may use cast formats like <code>T(x)</code> only when
<code>T</code> is a class type.</p>

<p class="definition"></p>
<p> C++ introduced a
different cast system from C that distinguishes the types
of cast operations.</p>

<p class="pros"></p>
<p>The problem with C casts is the ambiguity of the operation;
sometimes you are doing a <em>conversion</em>
(e.g., <code>(int)3.5</code>) and sometimes you are doing
a <em>cast</em> (e.g., <code>(int)"hello"</code>). Brace
initialization and C++ casts can often help avoid this
ambiguity. Additionally, C++ casts are more visible when searching for
them.</p>

<p class="cons"></p>
<p>The C++-style cast syntax is verbose and cumbersome.</p>

<p class="decision"></p>
<p>In general, do not use C-style casts. Instead, use these C++-style
casts when explicit type conversion is necessary.
</p>

<ul>
  <li>Use brace initialization to convert arithmetic types
  (e.g., <code>int64_t{x}</code>).  This is the safest approach because code
  will not compile if conversion can result in information loss.  The
  syntax is also concise.</li>

  <li>When explicitly converting to a class type, use a function-style cast;
  e.g., prefer <code>std::string(some_cord)</code> to
  <code>static_cast&lt;std::string&gt;(some_cord)</code>.</li>

  <li>Use <code>absl::implicit_cast</code>
  to safely cast up a type hierarchy,
  e.g., casting a <code>Foo*</code> to a
  <code>SuperclassOfFoo*</code> or casting a
  <code>Foo*</code> to a <code>const Foo*</code>. C++
  usually does this automatically but some situations
  need an explicit up-cast, such as use of the
  <code>?:</code> operator.</li>

  <li>Use <code>static_cast</code> as the equivalent of a C-style cast
  that does value conversion, when you need to
  explicitly up-cast a pointer from a class to its superclass, or when
  you need to explicitly cast a pointer from a superclass to a
  subclass.  In this last case, you must be sure your object is
  actually an instance of the subclass.</li>



  <li>Use <code>const_cast</code> to remove the
  <code>const</code> qualifier (see <a href="#Use_of_const">const</a>).</li>

  <li>Use <code>reinterpret_cast</code> to do unsafe conversions of
  pointer types to and from integer and other pointer
  types,
  including <code>void*</code>. Use this
  only if you know what you are doing and you understand the aliasing
  issues. Also, consider dereferencing the pointer (without a cast) and
  using <code>std::bit_cast</code> to cast the resulting value.</li>

  <li>Use <code>std::bit_cast</code> to interpret the raw bits of a
  value using a different type of the same size (a type pun), such as
  interpreting the bits of a <code>double</code> as
  <code>int64_t</code>.</li>
</ul>

<p>See the <a href="#Run-Time_Type_Information__RTTI_">
RTTI section</a> for guidance on the use of
<code>dynamic_cast</code>.</p>

<h3 id="Streams">Streams</h3>

<p>Use streams where appropriate, and stick to "simple"
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>

<p class="definition"></p>
<p>Streams are the standard I/O abstraction in C++, as
exemplified by the standard header <code>&lt;iostream&gt;</code>.
They are widely used in Google code, mostly for debug logging
and test diagnostics.</p>

<p class="pros"></p>
<p>The <code>&lt;&lt;</code> and <code>&gt;&gt;</code>
stream operators provide an API for formatted I/O that
is easily learned, portable, reusable, and extensible.
<code>printf</code>, by contrast, doesn't even support
<code>std::string</code>, to say nothing of user-defined types,
and is very difficult to use portably.
<code>printf</code> also obliges you to choose among the
numerous slightly different versions of that function,
and navigate the dozens of conversion specifiers.</p>

<p>Streams provide first-class support for console I/O
via <code>std::cin</code>, <code>std::cout</code>,
<code>std::cerr</code>, and <code>std::clog</code>.
The C APIs do as well, but are hampered by the need to
manually buffer the input. </p>

<p class="cons"></p>
<ul>
<li>Stream formatting can be configured by mutating the
state of the stream. Such mutations are persistent, so
the behavior of your code can be affected by the entire
previous history of the stream, unless you go out of your
way to restore it to a known state every time other code
might have touched it. User code can not only modify the
built-in state, it can add new state variables and behaviors
through a registration system.</li>

<li>It is difficult to precisely control stream output, due
to the above issues, the way code and data are mixed in
streaming code, and the use of operator overloading (which
may select a different overload than you expect).</li>

<li>The practice of building up output through chains
of <code>&lt;&lt;</code> operators interferes with
internationalization, because it bakes word order into the
code, and streams' support for localization is <a href="http://www.boost.org/doc/libs/1_48_0/libs/locale/doc/html/rationale.html#rationale_why">
flawed</a>.</li>





<li>The streams API is subtle and complex, so programmers must
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
large codebase, it can consume as much as 20% of the parsing
and semantic analysis time.</li>
</ul>

<p class="decision"></p>
<p>Use streams only when they are the best tool for the job.
This is typically the case when the I/O is ad-hoc, local,
human-readable, and targeted at other developers rather than
end-users. Be consistent with the code around you, and with the
codebase as a whole; if there's an established tool for
your problem, use that tool instead.
In particular,

logging libraries are usually a better
choice than <code>std::cerr</code> or <code>std::clog</code>
for diagnostic output, and the libraries in

<code>absl/strings</code>
or the equivalent are usually a
better choice than <code>std::stringstream</code>.</p>

<p>Avoid using streams for I/O that faces external users or
handles untrusted data. Instead, find and use the appropriate
templating libraries to handle issues like internationalization,
localization, and security hardening.</p>

<p>If you do use streams, avoid the stateful parts of the
streams API (other than error state), such as <code>imbue()</code>,
<code>xalloc()</code>, and <code>register_callback()</code>.
Use explicit formatting functions (such as
<code>absl::StreamFormat()</code>) rather than
stream manipulators or formatting flags to control formatting
details such as number base, precision, or padding.</p>

<p>Overload <code>&lt;&lt;</code> as a streaming operator
for your type only if your type represents a value, and
<code>&lt;&lt;</code> writes out a human-readable string
representation of that value. Avoid exposing implementation
details in the output of <code>&lt;&lt;</code>; if you need to print
object internals for debugging, use named functions instead
(a method named <code>DebugString()</code> is the most common
convention).</p>

<h3 id="Preincrement_and_Predecrement">Preincrement and Predecrement</h3>

<p>Use the prefix form (<code>++i</code>) of the increment
and decrement operators unless you need postfix semantics.</p>

<p class="definition"></p>
<p> When a variable
is incremented (<code>++i</code> or <code>i++</code>) or
decremented (<code>--i</code> or <code>i--</code>) and
the value of the expression is not used, one must decide
whether to preincrement (decrement) or postincrement
(decrement).</p>

<p class="pros"></p>

<p>A postfix increment/decrement expression evaluates to the value
<i>as it was before it was modified</i>. This can result in code that is more
compact but harder to read. The prefix form is generally more readable, is
never less efficient, and can be more efficient because it doesn't need to
make a copy of the value as it was before the operation.
</p>

<p class="cons"></p>
<p>The tradition developed, in C, of using post-increment, even
when the expression value is not used, especially in
<code>for</code> loops.</p>

<p class="decision"></p>
<p>Use prefix increment/decrement, unless the code explicitly
needs the result of the postfix increment/decrement expression.</p>

<h3 id="Use_of_const">Use of const</h3>

<p>In APIs, use <code>const</code> whenever it makes sense.
<code>constexpr</code> is a better choice for some uses of
<code>const</code>.</p>

<p class="definition"></p>
<p> Declared variables and parameters can be preceded
by the keyword <code>const</code> to indicate the variables
are not changed (e.g., <code>const int foo</code>). Class
functions can have the <code>const</code> qualifier to
indicate the function does not change the state of the
class member variables (e.g., <code>class Foo { int
Bar(char c) const; };</code>).</p>

<p class="pros"></p>
<p>Easier for people to understand how variables are being
used. Allows the compiler to do better type checking,
and, conceivably, generate better code. Helps people
convince themselves of program correctness because they
know the functions they call are limited in how they can
modify your variables. Helps people know what functions
are safe to use without locks in multi-threaded
programs.</p>

<p class="cons"></p>
<p><code>const</code> is viral: if you pass a
<code>const</code> variable to a function, that function
must have <code>const</code> in its prototype (or the
variable will need a <code>const_cast</code>). This can
be a particular problem when calling library
functions.</p>

<p class="decision"></p>
<p>We strongly recommend using <code>const</code>
in APIs (i.e., on function parameters, methods, and
non-local variables) wherever it is meaningful and accurate. This
provides consistent, mostly compiler-verified documentation
of what objects an operation can mutate. Having
a consistent and reliable way to distinguish reads from writes
is critical to writing thread-safe code, and is useful in
many other contexts as well. In particular:</p>

<ul>
  <li>If a function guarantees that it will not modify an argument
  passed by reference or by pointer, the corresponding function parameter
  should be a reference-to-const (<code>const T&amp;</code>) or
  pointer-to-const (<code>const T*</code>), respectively.</li>

  <li>For a function parameter passed by value, <code>const</code> has
  no effect on the caller, thus is not recommended in function
  declarations. See <a href="https://abseil.io/tips/109">TotW #109</a>.</li>

  <li>Declare methods to be <code>const</code> unless they
  alter the logical state of the object (or enable the user to modify
  that state, e.g., by returning a non-<code>const</code> reference, but that's
  rare), or they can't safely be invoked concurrently.</li>
</ul>

<p>Using <code>const</code> on local variables is neither encouraged
nor discouraged.</p>

<p>All of a class's <code>const</code> operations should be safe
to invoke concurrently with each other. If that's not feasible, the class must
be clearly documented as "thread-unsafe".</p>


<h4>Where to put the const</h4>

<p>Some people favor the form <code>int const* foo</code>
to <code>const int* foo</code>. They argue that this is
more readable because it's more consistent: it keeps the
rule that <code>const</code> always follows the object
it's describing. However, this consistency argument
doesn't apply in codebases with few deeply-nested pointer
expressions since most <code>const</code> expressions
have only one <code>const</code>, and it applies to the
underlying value. In such cases, there's no consistency
to maintain. Putting the <code>const</code> first is
arguably more readable, since it follows English in
putting the "adjective" (<code>const</code>) before the
"noun" (<code>int</code>).</p>

<p>That said, while we encourage putting
<code>const</code> first, we do not require it. But be
consistent with the code around you!</p>

<h3 id="Use_of_constexpr">Use of constexpr, constinit, and consteval</h3>

<p>Use <code>constexpr</code> to define true
constants or to ensure constant initialization.
Use <code>constinit</code> to ensure constant
initialization for non-constant variables.
</p>

<p class="definition"></p>
<p> Some variables can be declared <code>constexpr</code>
to indicate the variables are true constants, i.e., fixed at
compilation/link time. Some functions and constructors
can be declared <code>constexpr</code> which enables them
to be used in defining a <code>constexpr</code>
variable. Functions can be declared <code>consteval</code>
to restrict their use to compile time.</p>

<p class="pros"></p>
<p>Use of <code>constexpr</code> enables definition of
constants with floating-point expressions rather than
just literals; definition of constants of user-defined
types; and definition of constants with function
calls.</p>

<p class="cons"></p>
<p>Prematurely marking something as <code>constexpr</code> may cause
migration problems if later on it has to be downgraded.
Current restrictions on what is allowed in <code>constexpr</code>
functions and constructors may invite obscure workarounds
in these definitions.</p>

<p class="decision"></p>
<p><code>constexpr</code> definitions enable a more
robust specification of the constant parts of an
interface. Use <code>constexpr</code> to specify true
constants and the functions that support their
definitions. <code>consteval</code> may be used for
code that must not be invoked at runtime.
Avoid complexifying function definitions to
enable their use with <code>constexpr</code>. Do not use
<code>constexpr</code> or <code>consteval</code> to force inlining.</p>

<h3 id="Integer_Types">Integer Types</h3>

<p>Of the built-in C++ integer types, the only one used
 is
<code>int</code>. If a program needs an integer type of a
different size, use an exact-width integer type from
<code>&lt;stdint.h&gt;</code>, such as
<code>int16_t</code>. If you have a
value that could ever be greater than or equal to 2^31,
use a 64-bit type such as <code>int64_t</code>.
Keep in mind that even if your value won't ever be too large
for an <code>int</code>, it may be used in intermediate
calculations which may require a larger type. When in doubt,
choose a larger type.</p>

<p class="definition"></p>
<p>C++ does not specify exact sizes for the integer types
like <code>int</code>. Common sizes on contemporary architectures are
16 bits for <code>short</code>, 32 bits for <code>int</code>, 32 or 64
bits for <code>long</code>, and 64 bits for <code>long long</code>,
but different platforms make different choices, in particular
for <code>long</code>.</p>

<p class="pros"></p>
<p>Uniformity of declaration.</p>

<p class="cons"></p>
<p>The sizes of integral types in C++ can vary based on
compiler and architecture.</p>

<p class="decision"></p>

<p>
The standard library header <code>&lt;stdint.h&gt;</code> defines types
like <code>int16_t</code>, <code>uint32_t</code>,
<code>int64_t</code>, etc. You should always use
those in preference to <code>short</code>, <code>unsigned
long long</code>, and the like, when you need a guarantee
on the size of an integer. Prefer to omit the <code>std::</code>
prefix for these types, as the extra 5 characters do
not merit the added clutter. Of the built-in integer types, only
<code>int</code> should be used. When appropriate, you
are welcome to use standard type aliases like
<code>size_t</code> and <code>ptrdiff_t</code>.</p>

<p>We use <code>int</code> very often, for integers we
know are not going to be too big, e.g., loop counters.
Use plain old <code>int</code> for such things. You
should assume that an <code>int</code> is

at least 32 bits, but don't
assume that it has more than 32 bits. If you need a 64-bit
integer type, use <code>int64_t</code> or <code>uint64_t</code>.

</p><p>For integers we know can be "big",
 use
<code>int64_t</code>.
</p>

<p>You should not use the unsigned integer types such as
<code>uint32_t</code>, unless there is a valid
reason such as representing a bit pattern rather than a
number, or you need defined overflow modulo 2^N. In
particular, do not use unsigned types to say a number
will never be negative. Instead, use

assertions for this.</p>



<p>If your code is a container that returns a size, be
sure to use a type that will accommodate any possible
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 undefined behavior, leading to security bugs and
other problems.</p>

<h4>On Unsigned Integers</h4>

<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>

<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>

<h3 id="Floating-Point_Types">Floating-Point Types</h3>

<p>Of the built-in C++ floating-point types, the only ones used
 are <code>float</code> and
<code>double</code>. You may assume that these types represent IEEE-754 binary32
and binary64, respectively.</p>

<p>Do not use <code>long double</code>, as it gives non-portable
results.</p>

<a id="64-bit_Portability"></a>
<h3 id="Architecture_Portability">Architecture Portability</h3>

<p>Write architecture-portable code. Do not rely on CPU features specific to a
single processor.</p>

<ul>
  <li>When printing values, use type-safe numeric formatting libraries like
  <a href="https://github.com/abseil/abseil-cpp/blob/master/absl/strings/str_cat.h"><code>absl::StrCat</code></a>,
  <a href="https://github.com/abseil/abseil-cpp/blob/master/absl/strings/substitute.h"><code>absl::Substitute</code></a>,
  <a href="https://github.com/abseil/abseil-cpp/blob/master/absl/strings/str_format.h"><code>absl::StrFormat</code></a>,
  or <a href="#Streams"><code>std::ostream</code></a> instead of the
  <code>printf</code> family of functions.</li>

  <li>When moving structured data into or out of your process, encode it using a
  serialization library like
  <a href="https://protobuf.dev/">Protocol
  Buffers</a> rather than copying the in-memory representation around.
  </li>

  <li>If you need to work with memory addresses as integers, store them in
  <code>uintptr_t</code>s rather than <code>uint32_t</code>s or
  <code>uint64_t</code>s.</li>

  <li>
  Use <a href="#Casting">braced-initialization</a> as needed to create
  64-bit constants. For example:
<pre class="goodcode">int64_t my_value{0x123456789};
uint64_t my_mask{uint64_t{3} &lt;&lt; 48};
</pre>
  </li>

  <li>Use portable <a href="#Floating-Point_Types">floating point types</a>;
  avoid <code>long double</code>.</li>

  <li>Use portable <a href="#Integer_Types">integer types</a>; avoid
  <code>short</code>, <code>long</code>, and <code>long long</code>.</li>
</ul>

<h3 id="Preprocessor_Macros">Preprocessor Macros</h3>

<p>Avoid defining macros, especially in headers; prefer
inline functions, enums, and <code>const</code> variables.
Name macros with a project-specific prefix. Do not use
macros to define pieces of a C++ API.</p>

<p>Macros mean that the code you see is not the same as
the code the compiler sees. This can introduce unexpected
behavior, especially since macros have global scope.</p>

<p>The problems introduced by macros are especially severe
when they are used to define pieces of a C++ API,
and still more so for public APIs. Every error message from
the compiler when developers incorrectly use that interface
now must explain how the macros formed the interface.
Refactoring and analysis tools have a dramatically harder
time updating the interface. As a consequence, we
specifically disallow using macros in this way.
For example, avoid patterns like:</p>

<pre class="badcode">class WOMBAT_TYPE(Foo) {
  // ...

 public:
  EXPAND_PUBLIC_WOMBAT_API(Foo)

  EXPAND_WOMBAT_COMPARISONS(Foo, ==, &lt;)
};
</pre>

<p>Luckily, macros are not nearly as necessary in C++ as
they are in C. Instead of using a macro to inline
performance-critical code, use an inline function.
Instead of using a macro to store a constant, use a
<code>const</code> variable. Instead of using a macro to
"abbreviate" a long variable name, use a reference.
Instead of using a macro to conditionally compile code
... well, don't do that at all (except, of course, for
the <code>#define</code> guards to prevent double
inclusion of header files). It makes testing much more
difficult.</p>

<p>Macros can do things these other techniques cannot,
and you do see them in the codebase, especially in the
lower-level libraries. And some of their special features
(like stringifying, concatenation, and so forth) are not
available through the language proper. But before using a
macro, consider carefully whether there's a non-macro way
to achieve the same result. If you need to use a macro to
define an interface, contact
your project leads to request
a waiver of this rule.</p>

<p>The following usage pattern will avoid many problems
with macros; if you use macros, follow it whenever
possible:</p>

<ul>
  <li>Don't define macros in a <code>.h</code> file.</li>

  <li><code>#define</code> macros right before you use
  them, and <code>#undef</code> them right after.</li>

  <li>Do not just <code>#undef</code> an existing macro
  before replacing it with your own; instead, pick a name
  that's likely to be unique.</li>

  <li>Try not to use macros that expand to unbalanced C++
  constructs, or at least document that behavior
  well.</li>

  <li>Prefer not using <code>##</code> to generate
  function/class/variable names.</li>

</ul>

<p>Exporting macros from headers (i.e., defining them in a header
without <code>#undef</code>ing them before the end of the header)
is extremely strongly discouraged. If you do export a macro from a
header, it must have a globally unique name. To achieve this, it
must be named with a prefix consisting of your project's namespace
name (but upper case). </p>

<h3 id="0_and_nullptr/NULL">0 and nullptr/NULL</h3>

<p>Use <code>nullptr</code> for pointers, and <code>'\0'</code> for chars (and
not the <code>0</code> literal).</p>

<p>For pointers (address values), use <code>nullptr</code>, as this
provides type-safety.</p>

<p>Use <code>'\0'</code> for the null character. Using the correct type makes
the code more readable.</p>

<h3 id="sizeof">sizeof</h3>

<p>Prefer <code>sizeof(<var>varname</var>)</code> to
<code>sizeof(<var>type</var>)</code>.</p>

<p>Use <code>sizeof(<var>varname</var>)</code> when you
take the size of a particular variable.
<code>sizeof(<var>varname</var>)</code> will update
appropriately if someone changes the variable type either
now or later. You may use
<code>sizeof(<var>type</var>)</code> for code unrelated
to any particular variable, such as code that manages an
external or internal data format where a variable of an
appropriate C++ type is not convenient.</p>

<pre class="goodcode">MyStruct data;
memset(&amp;data, 0, sizeof(data));
</pre>

<pre class="badcode">memset(&amp;data, 0, sizeof(MyStruct));
</pre>

<pre class="goodcode">if (raw_size &lt; sizeof(int)) {
  LOG(ERROR) &lt;&lt; "compressed record not big enough for count: " &lt;&lt; raw_size;
  return false;
}
</pre>

<a id="auto"></a>
<h3 id="Type_deduction">Type Deduction (including auto)</h3>

<p>Use type deduction only if it makes the code clearer to readers who aren't
  familiar with the project, or if it makes the code safer. Do not use it
  merely to avoid the inconvenience of writing an explicit type.</p>

<p class="definition"></p>

<p>There are several contexts in which C++ allows (or even requires) types to
be deduced by the compiler, rather than spelled out explicitly in the code:</p>
<dl>
  <dt><a href="https://en.cppreference.com/w/cpp/language/template_argument_deduction">Function template argument deduction</a></dt>
  <dd>A function template can be invoked without explicit template arguments.
    The compiler deduces those arguments from the types of the function
    arguments:
    <pre class="neutralcode">template &lt;typename T&gt;
void f(T t);

f(0);  // Invokes f&lt;int&gt;(0)</pre>
  </dd>
  <dt><a href="https://en.cppreference.com/w/cpp/language/auto"><code>auto</code> variable declarations</a></dt>
  <dd>A variable declaration can use the <code>auto</code> keyword in place
    of the type. The compiler deduces the type from the variable's
    initializer, following the same rules as function template argument
    deduction with the same initializer (so long as you don't use curly braces
    instead of parentheses).
    <pre class="neutralcode">auto a = 42;  // a is an int
auto&amp; b = a;  // b is an int&amp;
auto c = b;   // c is an int
auto d{42};   // d is an int, not a std::initializer_list&lt;int&gt;
</pre>
    <code>auto</code> can be qualified with <code>const</code>, and can be
    used as part of a pointer or reference type, and (since C++17) as a
    non-type template argument. A rare variant of this syntax uses
    <code>decltype(auto)</code> instead of <code>auto</code>, in which case
    the deduced type is the result of applying
    <a href="https://en.cppreference.com/w/cpp/language/decltype"><code>decltype</code></a>
    to the initializer.
  </dd>
  <dt><a href="https://en.cppreference.com/w/cpp/language/function#Return_type_deduction">Function return type deduction</a></dt>
  <dd><code>auto</code> (and <code>decltype(auto)</code>) can also be used in
    place of a function return type. The compiler deduces the return type from
    the <code>return</code> statements in the function body, following the same
    rules as for variable declarations:
    <pre class="neutralcode">auto f() { return 0; }  // The return type of f is int</pre>
    <a href="#Lambda_expressions">Lambda expression</a> return types can be
    deduced in the same way, but this is triggered by omitting the return type,
    rather than by an explicit <code>auto</code>. Confusingly,
    <a href="#trailing_return">trailing return type</a> syntax for functions
    also uses <code>auto</code> in the return-type position, but that doesn't
    rely on type deduction; it's just an alternative syntax for an explicit
    return type.
  </dd>
  <dt><a href="https://isocpp.org/wiki/faq/cpp14-language#generic-lambdas">Generic lambdas</a></dt>
  <dd>A lambda expression can use the <code>auto</code> keyword in place of
    one or more of its parameter types. This causes the lambda's call operator
    to be a function template instead of an ordinary function, with a separate
    template parameter for each <code>auto</code> function parameter:
    <pre class="neutralcode">// Sort `vec` in decreasing order
std::sort(vec.begin(), vec.end(), [](auto lhs, auto rhs) { return lhs &gt; rhs; });</pre>
  </dd>
  <dt><a href="https://isocpp.org/wiki/faq/cpp14-language#lambda-captures">Lambda init captures</a></dt>
  <dd>Lambda captures can have explicit initializers, which can be used to
    declare wholly new variables rather than only capturing existing ones:
    <pre class="neutralcode">[x = 42, y = "foo"] { ... }  // x is an int, and y is a const char*</pre>
    This syntax doesn't allow the type to be specified; instead, it's deduced
    using the rules for <code>auto</code> variables.
  </dd>
  <dt><a href="https://en.cppreference.com/w/cpp/language/class_template_argument_deduction">Class template argument deduction</a></dt>
  <dd>See <a href="#CTAD">below</a>.</dd>
  <dt><a href="https://en.cppreference.com/w/cpp/language/structured_binding">Structured bindings</a></dt>
  <dd>When declaring a tuple, struct, or array using <code>auto</code>, you can
    specify names for the individual elements instead of a name for the whole
    object; these names are called "structured bindings", and the whole
    declaration is called a "structured binding declaration". This syntax
    provides no way of specifying the type of either the enclosing object
    or the individual names:
    <pre class="neutralcode">auto [iter, success] = my_map.insert({key, value});
if (!success) {
  iter-&gt;second = value;
}</pre>
    The <code>auto</code> can also be qualified with <code>const</code>,
    <code>&amp;</code>, and <code>&amp;&amp;</code>, but note that these qualifiers
    technically apply to the anonymous tuple/struct/array, rather than the
    individual bindings. The rules that determine the types of the bindings
    are quite complex; the results tend to be unsurprising, except that
    the binding types typically won't be references even if the declaration
    declares a reference (but they will usually behave like references anyway).
  </dd>
</dl>

<p>(These summaries omit many details and caveats; see the links for further
  information.)</p>

<p class="pros"></p>

<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
    small code region, the repetition may not be aiding readability.</li>
  <li>It is sometimes safer to let the type be deduced, since that avoids
    the possibility of unintended copies or type conversions.</li>
</ul>

<p class="cons"></p>
<p>C++ code is usually clearer when types are explicit,
  especially when type deduction would depend on information from
  distant parts of the code. In expressions like:</p>

<pre class="badcode">auto foo = x.add_foo();
auto i = y.Find(key);
</pre>

<p>it may not be obvious what the resulting types are if the type
  of <code>y</code> isn't very well known, or if <code>y</code> was
  declared many lines earlier.</p>

<p>Programmers have to understand when type deduction will or won't
  produce a reference type, or they'll get copies when they didn't
  mean to.</p>

<p>If a deduced type is used as part of an interface, then a
  programmer might change its type while only intending to
  change its value, leading to a more radical API change
  than intended.</p>

<p class="decision"></p>

<p>The fundamental rule is: use type deduction only to make the code
  clearer or safer, and do not use it merely to avoid the
  inconvenience of writing an explicit type. When judging whether the
  code is clearer, keep in mind that your readers are not necessarily
  on your team, or familiar with your project, so types that you and
  your reviewer experience as unnecessary clutter will very often
  provide useful information to others. For example, you can assume that
  the return type of <code>make_unique&lt;Foo&gt;()</code> is obvious,
  but the return type of <code>MyWidgetFactory()</code> probably isn't.</p>

  <p>These principles apply to all forms of type deduction, but the
  details vary, as described in the following sections.</p>

<h4>Function template argument deduction</h4>

<p>Function template argument deduction is almost always OK. Type deduction
  is the expected default way of interacting with function templates,
  because it allows function templates to act like infinite sets of ordinary
  function overloads. Consequently, function templates are almost always
  designed so that template argument deduction is clear and safe, or
  doesn't compile.</p>

<h4>Local variable type deduction</h4>

<p>For local variables, you can use type deduction to make the code clearer
  by eliminating type information that is obvious or irrelevant, so that
  the reader can focus on the meaningful parts of the code:</p>
  <pre class="neutralcode">std::unique_ptr&lt;WidgetWithBellsAndWhistles&gt; widget =
    std::make_unique&lt;WidgetWithBellsAndWhistles&gt;(arg1, arg2);
absl::flat_hash_map&lt;std::string,
                    std::unique_ptr&lt;WidgetWithBellsAndWhistles&gt;&gt;::const_iterator
    it = my_map_.find(key);
std::array&lt;int, 6&gt; numbers = {4, 8, 15, 16, 23, 42};</pre>

  <pre class="goodcode">auto widget = std::make_unique&lt;WidgetWithBellsAndWhistles&gt;(arg1, arg2);
auto it = my_map_.find(key);
std::array numbers = {4, 8, 15, 16, 23, 42};</pre>

<p>Types sometimes contain a mixture of useful information and boilerplate,
  such as <code>it</code> in the example above: it's obvious that the
  type is an iterator, and in many contexts the container type and even the
  key type aren't relevant, but the type of the values is probably useful.
  In such situations, it's often possible to define local variables with
  explicit types that convey the relevant information:</p>
  <pre class="goodcode">if (auto it = my_map_.find(key); it != my_map_.end()) {
  WidgetWithBellsAndWhistles&amp; widget = *it-&gt;second;
  // Do stuff with `widget`
}</pre>
<p>If the type is a template instance, and the parameters are
  boilerplate but the template itself is informative, you can use
  class template argument deduction to suppress the boilerplate. However,
  cases where this actually provides a meaningful benefit are quite rare.
  Note that class template argument deduction is also subject to a
  <a href="#CTAD">separate style rule</a>.</p>

<p>Do not use <code>decltype(auto)</code> if a simpler option will work;
  because it's a fairly obscure feature, it has a high cost in code
  clarity.</p>

<h4>Return type deduction</h4>

<p>Use return type deduction (for both functions and lambdas) only if the
  function body has a very small number of <code>return</code> statements,
  and very little other code, because otherwise the reader may not be able
  to tell at a glance what the return type is. Furthermore, use it only
  if the function or lambda has a very narrow scope, because functions with
  deduced return types don't define abstraction boundaries: the implementation
  <em>is</em> the interface. In particular, public functions in header files
  should almost never have deduced return types.</p>

<h4>Parameter type deduction</h4>

<p><code>auto</code> parameter types for lambdas should be used with caution,
  because the actual type is determined by the code that calls the lambda,
  rather than by the definition of the lambda. Consequently, an explicit
  type will almost always be clearer unless the lambda is explicitly called
  very close to where it's defined (so that the reader can easily see both),
  or the lambda is passed to an interface so well-known that it's
  obvious what arguments it will eventually be called with (e.g.,
  the <code>std::sort</code> example above).</p>

<h4>Lambda init captures</h4>

<p>Init captures are covered by a <a href="#Lambda_expressions">more specific
    style rule</a>, which largely supersedes the general rules for
  type deduction.</p>

<h4>Structured bindings</h4>

<p>Unlike other forms of type deduction, structured bindings can actually
  give the reader additional information, by giving meaningful names to the
  elements of a larger object. This means that a structured binding declaration
  may provide a net readability improvement over an explicit type, even in cases
  where <code>auto</code> would not. Structured bindings are especially
  beneficial when the object is a pair or tuple (as in the <code>insert</code>
  example above), because they don't have meaningful field names to begin with,
  but note that you generally <a href="#Structs_vs._Tuples">shouldn't use
    pairs or tuples</a> unless a pre-existing API like <code>insert</code>
  forces you to.</p>

<p>If the object being bound is a struct, it may sometimes be helpful to
  provide names that are more specific to your usage, but keep in mind that
  this may also mean the names are less recognizable to your reader than the
  field names. We recommend using a comment to indicate the name of the
  underlying field, if it doesn't match the name of the binding, using the
  same syntax as for function parameter comments:</p>
  <pre class="goodcode">auto [/*field_name1=*/bound_name1, /*field_name2=*/bound_name2] = ...</pre>
<p>As with function parameter comments, this can enable tools to detect if
  you get the order of the fields wrong.</p>

<h3 id="CTAD">Class Template Argument Deduction</h3>

<p>Use class template argument deduction only with templates that have
  explicitly opted into supporting it.</p>

<p class="definition"></p>
<p><a href="https://en.cppreference.com/w/cpp/language/class_template_argument_deduction">Class
    template argument deduction</a> (often abbreviated "CTAD") occurs when
  a variable is declared with a type that names a template, and the template
  argument list is not provided (not even empty angle brackets):</p>
  <pre class="neutralcode">std::array a = {1, 2, 3};  // `a` is a std::array&lt;int, 3&gt;</pre>
<p>The compiler deduces the arguments from the initializer using the
  template's "deduction guides", which can be explicit or implicit.</p>

<p>Explicit deduction guides look like function declarations with trailing
  return types, except that there's no leading <code>auto</code>, and the
  function name is the name of the template. For example, the above example
  relies on this deduction guide for <code>std::array</code>:</p>
  <pre class="neutralcode">namespace std {
template &lt;class T, class... U&gt;
array(T, U...) -&gt; std::array&lt;T, 1 + sizeof...(U)&gt;;
}</pre>
<p>Constructors in a primary template (as opposed to a template specialization)
  also implicitly define deduction guides.</p>

<p>When you declare a variable that relies on CTAD, the compiler selects
  a deduction guide using the rules of constructor overload resolution,
  and that guide's return type becomes the type of the variable.</p>

<p class="pros"></p>
<p>CTAD can sometimes allow you to omit boilerplate from your code.</p>

<p class="cons"></p>
<p>The implicit deduction guides that are generated from constructors
  may have undesirable behavior, or be outright incorrect. This is
  particularly problematic for constructors written before CTAD was
  introduced in C++17, because the authors of those constructors had no
  way of knowing about (much less fixing) any problems that their
  constructors would cause for CTAD. Furthermore, adding explicit deduction
  guides to fix those problems might break any existing code that relies on
  the implicit deduction guides.</p>

<p>CTAD also suffers from many of the same drawbacks as <code>auto</code>,
  because they are both mechanisms for deducing all or part of a variable's
  type from its initializer. CTAD does give the reader more information
  than <code>auto</code>, but it also doesn't give the reader an obvious
  cue that information has been omitted.</p>

<p class="decision"></p>
<p>Do not use CTAD with a given template unless the template's maintainers
  have opted into supporting use of CTAD by providing at least one explicit
  deduction guide (all templates in the <code>std</code> namespace are
  also presumed to have opted in). This should be enforced with a compiler
  warning if available.</p>

<p>Uses of CTAD must also follow the general rules on
  <a href="#Type_deduction">Type deduction</a>.</p>

<h3 id="Designated_initializers">Designated Initializers</h3>

<p>Use designated initializers only in their C++20-compliant form.</p>

<p class="definition"></p>
<p><a href="https://en.cppreference.com/w/cpp/language/aggregate_initialization#Designated_initializers">
  Designated initializers</a> are a syntax that allows for initializing an
  aggregate ("plain old struct") by naming its fields explicitly:</p>
  <pre class="neutralcode">  struct Point {
    float x = 0.0;
    float y = 0.0;
    float z = 0.0;
  };

  Point p = {
    .x = 1.0,
    .y = 2.0,
    // z will be 0.0
  };</pre>
<p>The explicitly listed fields will be initialized as specified, and others
  will be initialized in the same way they would be in a traditional aggregate
  initialization expression like <code>Point{1.0, 2.0}</code>.</p>

<p class="pros"></p>
<p>Designated initializers can make for convenient and highly readable
aggregate expressions, especially for structs with less straightforward
ordering of fields than the <code>Point</code> example above.</p>

<p class="cons"></p>
<p>While designated initializers have long been part of the C standard and
supported by C++ compilers as an extension, they were not supported by
C++ prior to C++20.</p>

<p>The rules in the C++ standard are stricter than in C and compiler extensions,
requiring that the designated initializers appear in the same order as the
fields appear in the struct definition. So in the example above, it is legal
according to C++20 to initialize <code>x</code> and then <code>z</code>, but not
<code>y</code> and then <code>x</code>.</p>

<p class="decision"></p>
<p>Use designated initializers only in the form that is compatible with the
C++20 standard: with initializers in the same order as the corresponding fields
appear in the struct definition.</p>



<h3 id="Lambda_expressions">Lambda Expressions</h3>

<p>Use lambda expressions where appropriate. Prefer explicit captures
when the lambda will escape the current scope.</p>

<p class="definition"></p>
<p> Lambda expressions are a concise way of creating anonymous
function objects. They're often useful when passing
functions as arguments. For example:</p>

<pre class="neutralcode">std::sort(v.begin(), v.end(), [](int x, int y) {
  return Weight(x) &lt; Weight(y);
});
</pre>

<p> They further allow capturing variables from the enclosing scope either
explicitly by name, or implicitly using a default capture. Explicit captures
require each variable to be listed, as
either a value or reference capture:</p>

<pre class="neutralcode">int weight = 3;
int sum = 0;
// Captures `weight` by value and `sum` by reference.
std::for_each(v.begin(), v.end(), [weight, &amp;sum](int x) {
  sum += weight * x;
});
</pre>


<p>Default captures implicitly capture any variable referenced in the
lambda body, including <code>this</code> if any members are used:</p>

<pre class="neutralcode">const std::vector&lt;int&gt; lookup_table = ...;
std::vector&lt;int&gt; indices = ...;
// Captures `lookup_table` by reference, sorts `indices` by the value
// of the associated element in `lookup_table`.
std::sort(indices.begin(), indices.end(), [&amp;](int a, int b) {
  return lookup_table[a] &lt; lookup_table[b];
});
</pre>

<p>A variable capture can also have an explicit initializer, which can
  be used for capturing move-only variables by value, or for other situations
  not handled by ordinary reference or value captures:</p>
  <pre class="neutralcode">std::unique_ptr&lt;Foo&gt; foo = ...;
[foo = std::move(foo)] () {
  ...
}</pre>
<p>Such captures (often called "init captures" or "generalized lambda captures")
  need not actually "capture" anything from the enclosing scope, or even have
  a name from the enclosing scope; this syntax is a fully general way to define
  members of a lambda object:</p>
  <pre class="neutralcode">[foo = std::vector&lt;int&gt;({1, 2, 3})] () {
  ...
}</pre>
<p>The type of a capture with an initializer is deduced using the same rules
  as <code>auto</code>.</p>

<p class="pros"></p>
<ul>
  <li>Lambdas are much more concise than other ways of
   defining function objects to be passed to STL
   algorithms, which can be a readability
   improvement.</li>

  <li>Appropriate use of default captures can remove
    redundancy and highlight important exceptions from
    the default.</li>

   <li>Lambdas, <code>std::function</code>, and
   <code>std::bind</code> can be used in combination as a
   general purpose callback mechanism; they make it easy
   to write functions that take bound functions as
   arguments.</li>
</ul>

<p class="cons"></p>
<ul>
  <li>Variable capture in lambdas can be a source of dangling-pointer
  bugs, particularly if a lambda escapes the current scope.</li>

  <li>Default captures by value can be misleading because they do not prevent
  dangling-pointer bugs. Capturing a pointer by value doesn't cause a deep
  copy, so it often has the same lifetime issues as capture by reference.
  This is especially confusing when capturing <code>this</code> by value,
  since the use of <code>this</code> is often implicit.</li>

  <li>Captures actually declare new variables (whether or not the captures have
    initializers), but they look nothing like any other variable declaration
    syntax in C++. In particular, there's no place for the variable's type,
    or even an <code>auto</co
Download .txt
gitextract_omg5k8n9/

├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE.md
│   └── PULL_REQUEST_TEMPLATE.md
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── Rguide.md
├── Rguide.xml
├── _includes/
│   └── head-custom.html
├── angularjs-google-style.html
├── assets/
│   └── css/
│       └── style.scss
├── cppguide.html
├── cppguide.xml
├── csharp-style.md
├── docguide/
│   ├── README.md
│   ├── READMEs.md
│   ├── VERSION
│   ├── best_practices.md
│   ├── philosophy.md
│   └── style.md
├── eclipse-cpp-google-style.xml
├── eclipse-java-google-style.xml
├── go/
│   ├── best-practices.md
│   ├── decisions.md
│   ├── guide.md
│   └── index.md
├── google-c-style.el
├── google-r-style.html
├── google_python_style.vim
├── htmlcssguide.html
├── htmlcssguide.xml
├── include/
│   ├── jsguide.js
│   ├── styleguide.css
│   └── styleguide.js
├── intellij-java-google-style.xml
├── javaguide.css
├── javaguide.html
├── javascriptguide.xml
├── jsguide.html
├── jsoncstyleguide.html
├── jsoncstyleguide.xml
├── lispguide.xml
├── objcguide.md
├── objcguide.xml
├── pyguide.md
├── pylintrc
├── shell.xml
├── shell.xsl
├── shellguide.md
├── styleguide.css
├── styleguide.xsl
├── tsguide.html
├── vimscriptfull.xml
├── vimscriptguide.xml
└── xmlstyle.html
Download .txt
SYMBOL INDEX (11 symbols across 2 files)

FILE: include/jsguide.js
  function find (line 3) | function find(querySelector, callback) {

FILE: include/styleguide.js
  function CreateTOC (line 6) | function CreateTOC(tocElement) {
  function CreateHorizontalTOC (line 79) | function CreateHorizontalTOC(
  function AddTOCMaster (line 115) | function AddTOCMaster(tocTable, heading) {
  function AddTOCElements (line 144) | function AddTOCElements(toc_div, heading) {
  function CreateVerticalTOC (line 162) | function CreateVerticalTOC(headings, masterLevel, lowestLevel, tbody_ele...
  function hasClass (line 235) | function hasClass(element, cls) {
  function LinkifyHeader (line 245) | function LinkifyHeader(header, fileName, sizePixels) {
  function LinkifyHeadersForTag (line 259) | function LinkifyHeadersForTag(tagName) {
  function LinkifyHeaders (line 275) | function LinkifyHeaders() {
  function initStyleGuide (line 286) | function initStyleGuide() {
Condensed preview — 55 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,924K chars).
[
  {
    "path": ".github/CODEOWNERS",
    "chars": 261,
    "preview": "# https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax\n\ncsh"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 602,
    "preview": "This repository publishes copies of Google's internal style guides to\nassist developers working on Google owned and orig"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 675,
    "preview": "These style guides are copies of Google's internal style guides to\nassist developers working on Google owned and origina"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3111,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": "LICENSE",
    "chars": 19467,
    "preview": "Creative Commons Legal Code\n\nAttribution 3.0 Unported\n\n    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT P"
  },
  {
    "path": "README.md",
    "chars": 4802,
    "preview": "# Google Style Guides\n\nEvery major open-source project has its own style guide: a set of conventions\n(sometimes arbitrar"
  },
  {
    "path": "Rguide.md",
    "chars": 2982,
    "preview": "# Google's R Style Guide\n\nR is a high-level programming language used primarily for statistical computing\nand graphics. "
  },
  {
    "path": "Rguide.xml",
    "chars": 482,
    "preview": "<?xml version=\"1.0\"?>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\""
  },
  {
    "path": "_includes/head-custom.html",
    "chars": 78,
    "preview": "<link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/styleguide/favicon.ico\">\n"
  },
  {
    "path": "angularjs-google-style.html",
    "chars": 12751,
    "preview": "\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"https://www.w3.org/TR/REC-html40/strict.dtd\">\n<html>\n<head>\n    <META"
  },
  {
    "path": "assets/css/style.scss",
    "chars": 254,
    "preview": "---\n# Keep this YAML front matter block to trigger Jekyll processing.\n# See https://jekyllrb.com/docs/frontmatter for mo"
  },
  {
    "path": "cppguide.html",
    "chars": 241802,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Google C++ Style Guide</title>\n<link rel=\"styleshe"
  },
  {
    "path": "cppguide.xml",
    "chars": 711,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n  <meta http-e"
  },
  {
    "path": "csharp-style.md",
    "chars": 20082,
    "preview": "# C# at Google Style Guide\n\nThis style guide is for C# code developed internally at Google, and is the\ndefault style for"
  },
  {
    "path": "docguide/README.md",
    "chars": 254,
    "preview": "# Google documentation guide\n\n* [Markdown styleguide](style.md)\n* [Best practices](best_practices.md)\n* [README files](R"
  },
  {
    "path": "docguide/READMEs.md",
    "chars": 2074,
    "preview": "# READMEs\n\nAbout README.md files.\n\n1.  [Overview](#overview)\n1.  [Readable README files](#readable-readme-files)\n1.  [Wh"
  },
  {
    "path": "docguide/VERSION",
    "chars": 4,
    "preview": "2.0\n"
  },
  {
    "path": "docguide/best_practices.md",
    "chars": 6411,
    "preview": "# Documentation Best Practices\n\n\"Say what you mean, simply and directly.\" -\n[Brian Kernighan](https://en.wikipedia.org/w"
  },
  {
    "path": "docguide/philosophy.md",
    "chars": 2894,
    "preview": "# Philosophy\n\n埏埴以為器,當其無,有器之用.\n\n*Clay becomes pottery through craft, but it's the emptiness that makes a pot\nuseful.*\n\n\\-"
  },
  {
    "path": "docguide/style.md",
    "chars": 25867,
    "preview": "# Markdown style guide\n\nMuch of what makes Markdown refreshing is the ability to write plain text and get\ngreat formatte"
  },
  {
    "path": "eclipse-cpp-google-style.xml",
    "chars": 17612,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<profiles version=\"1\">\n<profile kind=\"CodeFormatterProfile\" name="
  },
  {
    "path": "eclipse-java-google-style.xml",
    "chars": 36003,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<profiles version=\"13\">\n<profile kind=\"CodeFormatterProfile\" name"
  },
  {
    "path": "go/best-practices.md",
    "chars": 138713,
    "preview": "<!--* toc_depth: 3 *-->\n\n# Go Style Best Practices\n\nhttps://google.github.io/styleguide/go/best-practices\n\n[Overview](in"
  },
  {
    "path": "go/decisions.md",
    "chars": 126121,
    "preview": "<!--* toc_depth: 3 *-->\n\n# Go Style Decisions\n\nhttps://google.github.io/styleguide/go/decisions\n\n[Overview](index) | [Gu"
  },
  {
    "path": "go/guide.md",
    "chars": 19740,
    "preview": "<!--* toc_depth: 3 *-->\n\n# Go Style Guide\n\nhttps://google.github.io/styleguide/go/guide\n\n[Overview](index) | [Guide](gui"
  },
  {
    "path": "go/index.md",
    "chars": 8565,
    "preview": "# Go Style\n\nhttps://google.github.io/styleguide/go\n\n[Overview](index) | [Guide](guide) | [Decisions](decisions) |\n[Best "
  },
  {
    "path": "google-c-style.el",
    "chars": 6199,
    "preview": ";;; google-c-style.el --- Google's C/C++ style for c-mode\n\n;; Keywords: c, tools\n\n;; google-c-style.el is Copyright (C) "
  },
  {
    "path": "google-r-style.html",
    "chars": 673,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"refresh\" content=\"1; url=Rguide.html\">\n  <tit"
  },
  {
    "path": "google_python_style.vim",
    "chars": 1607,
    "preview": "\" Copyright 2019 Google LLC\n\"\n\" Licensed under the Apache License, Version 2.0 (the \"License\");\n\" you may not use this f"
  },
  {
    "path": "htmlcssguide.html",
    "chars": 32047,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Google HTML/CSS Style Guide</title>\n<link rel=\"sty"
  },
  {
    "path": "htmlcssguide.xml",
    "chars": 232,
    "preview": "<?xml version=\"1.0\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"styleguide.xsl\"?>\n<GUIDE title=\"Google HTML/CSS Style Guide"
  },
  {
    "path": "include/jsguide.js",
    "chars": 2459,
    "preview": "window.initStyleGuide = function(init) {\n  // Runs the callback on every element matched by the query selector.\n  functi"
  },
  {
    "path": "include/styleguide.css",
    "chars": 3743,
    "preview": "/* General CSS */\n\nbody {\n  background-color: #fff;\n  color: #333;\n  font-family: sans-serif;\n  font-size: 10pt;\n  margi"
  },
  {
    "path": "include/styleguide.js",
    "chars": 8618,
    "preview": "TocTypeEnum = {\n  VERTICAL: 1,\n  HORIZONTAL: 2\n};\n\nfunction CreateTOC(tocElement) {\n\n  // Find the toc element DIV. We'l"
  },
  {
    "path": "intellij-java-google-style.xml",
    "chars": 22144,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<code_scheme name=\"GoogleStyle\">\n  <option name=\"OTHER_INDENT_OPTIONS\">\n    <valu"
  },
  {
    "path": "javaguide.css",
    "chars": 6755,
    "preview": "table {\n  border-collapse: collapse;\n}\n\ntd,\nth {\n  border: 1px solid #ccc;\n  padding: 2px 12px;\n  font-size: 10pt;\n}\n\nco"
  },
  {
    "path": "javaguide.html",
    "chars": 58068,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Google Java Style Guide</title>\n<link rel=\"stylesh"
  },
  {
    "path": "javascriptguide.xml",
    "chars": 134612,
    "preview": "<?xml version = '1.0'?>\n<?xml-stylesheet type=\"text/xsl\" href=\"styleguide.xsl\"?>\n<GUIDE title=\"Google JavaScript Style G"
  },
  {
    "path": "jsguide.html",
    "chars": 150585,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Google JavaScript Style Guide</title>\n<link rel=\"s"
  },
  {
    "path": "jsoncstyleguide.html",
    "chars": 745,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf8\">\n  <meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8"
  },
  {
    "path": "jsoncstyleguide.xml",
    "chars": 45625,
    "preview": "<?xml version=\"1.0\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"styleguide.xsl\"?>\n<GUIDE title=\"Google JSON Style Guide\">\n\n"
  },
  {
    "path": "lispguide.xml",
    "chars": 155976,
    "preview": "<?xml version=\"1.0\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"styleguide.xsl\"?>\n<GUIDE title=\"Google Common Lisp Style Gu"
  },
  {
    "path": "objcguide.md",
    "chars": 72773,
    "preview": "# Google Objective-C Style Guide\n\n> Objective-C is a dynamic, object-oriented extension of C. It's designed to be\n> easy"
  },
  {
    "path": "objcguide.xml",
    "chars": 276,
    "preview": "<?xml version=\"1.0\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"styleguide.xsl\"?>\n<GUIDE title=\"Google Objective-C Style Gu"
  },
  {
    "path": "pyguide.md",
    "chars": 115824,
    "preview": "<!--\nAUTHORS:\nPrefer only GitHub-flavored Markdown in external text.\nSee README.md for details.\n-->\n\n# Google Python Sty"
  },
  {
    "path": "pylintrc",
    "chars": 13570,
    "preview": "# This Pylint rcfile contains a best-effort configuration to uphold the\n# best-practices and style described in the Goog"
  },
  {
    "path": "shell.xml",
    "chars": 232,
    "preview": "<?xml version=\"1.0\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"shell.xsl\"?>\n\n<GUIDE title=\"Shell Style Guide\"> \nThe guide "
  },
  {
    "path": "shell.xsl",
    "chars": 8518,
    "preview": "<xsl:stylesheet version=\"1.0\"\nxmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\nxmlns:rdf=\"http://www.w3.org/1999/02/22-r"
  },
  {
    "path": "shellguide.md",
    "chars": 40115,
    "preview": "<!--\nAUTHORS:\nPrefer only GitHub-flavored Markdown in external text.\nSee README.md for details.\n-->\n\n# Shell Style Guide"
  },
  {
    "path": "styleguide.css",
    "chars": 2042,
    "preview": "body {\n  background-color: #fff;\n  color: #333;\n  font-family: sans-serif;\n  font-size: 10pt;\n  margin-right: 100px;\n  m"
  },
  {
    "path": "styleguide.xsl",
    "chars": 38583,
    "preview": "<xsl:stylesheet version=\"1.0\"\nxmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\nxmlns:rdf=\"http://www.w3.org/1999/02/22-r"
  },
  {
    "path": "tsguide.html",
    "chars": 141087,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>Google TypeScript Style Guide</title>\n<link rel=\"s"
  },
  {
    "path": "vimscriptfull.xml",
    "chars": 50305,
    "preview": "<?xml version = '1.0'?>\n<?xml-stylesheet type=\"text/xsl\" href=\"styleguide.xsl\"?>\n<GUIDE title=\"Google Vimscript Guide\">\n"
  },
  {
    "path": "vimscriptguide.xml",
    "chars": 14232,
    "preview": "<?xml version = '1.0'?>\n<?xml-stylesheet type=\"text/xsl\" href=\"styleguide.xsl\"?>\n<GUIDE title=\"Google Vimscript Style Gu"
  },
  {
    "path": "xmlstyle.html",
    "chars": 35220,
    "preview": "<link href=\"/styleguide/favicon.ico\" type=\"image/x-icon\" rel=\"shortcut icon\">\n<style type=\"text/css\">\n/* default css */\n"
  }
]

About this extraction

This page contains the full source code of the google/styleguide GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 55 files (1.8 MB), approximately 455.0k tokens, and a symbol index with 11 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!