docs/process/c++_version_upgrades.md
This describes both "why" and "how" around updating Chrome's C++ version (e.g. "C++17") to something newer.
Minimize toolchain support concerns in Chromium.
Example: A new feature is known to have edge-case bugs, which developers must be told to avoid.
Minimize toolchain support concerns in subprojects.
Example: Code in //base would benefit from some new feature, but is also built (in Cronet) by a toolchain that doesn't support that feature.
Avoid library incompatibilities.
Example: A new version of protobuf requires a new C++ version, which Chromium doesn't yet use.
Benefit from language/library improvements, subject to cost/benefit tests.
Example: Features like C++11's std::move or C++20's Concepts affect
large amounts of code and can be requirements for other features.
Maintain Chromium's history of being a modern, well-maintained project where engineers feel they have access to the tools they need.
Example: Abseil supports C++ versions for approximately 10 years, but being limited to ten-year-old standards is too limiting in Chromium.
Chrome ATLs are responsible for ensuring "important but not urgent" changes like this are prioritized and staffed appropriately. Their goal will be to upgrade Chrome's C++ version about 3 years after the date of the standard (e.g. for "C++35" we'd aim for ~2038).
This amount of lag time is approximately what happened for C++11-20 and is usually a good balance of tradeoffs. Earlier is possible for compelling features, but reducing the delay under two years is usually intractable for toolchain reasons. A bit later might be OK, but since a version update requires several months, it's best not to wait until there's an urgent need.
Version updates generally require one engineer, and take between a few weeks and a few months of full-time work (depending on what's changed in the standard), along with several months of coordination, rollout, and testing that doesn't require significant engineering time.
std::move had still resulted in a copy.