Using C++ in Mozilla code

C++ language features

Mozilla code only uses a subset of C++. Runtime type information (RTTI) is disabled, as it tends to cause a very large increase in codesize. This means that dynamic_cast, typeid() and <typeinfo> cannot be used in Mozilla code. Also disabled are exceptions; do not use try/catch or throw any exceptions. Libraries that throw exceptions may be used if you are willing to have the throw instead be treated as an abort.

As of Mozilla 25, C++11 mode is required to build Mozilla. As of Mozilla 48, gcc 4.8 is required on all platforms. As of Mozilla 50, MSVC 2015 Update 3 is required on Windows. This means that C++11 can be used where supported on all platforms. The list of acceptable features is given below:

  MSVC GCC Clang  
Current minimal requirement 2015u3 4.8 3.6  
Feature MSVC GCC Clang Can be used in code
type_t && 2010 4.3 2.9 Yes (see notes)
ref qualifiers on methods 2015 4.8.1 2.9 Yes
member initializers 2013 4.7 3.0 Yes
variadic templates 2013 4.3 2.9 Yes
Initializer lists 2013 4.4 3.1 Yes
static_assert 2010 4.3 2.9 Yes
auto 2010 4.4 2.9 Yes
lambdas 2010 4.5 3.1 Yes
decltype 2010 4.3 2.9 Yes
Foo<Bar<T>> 2010 4.3 2.9 Yes
auto func() -> int 2010 4.4 3.1 Yes
Templated aliasing 2013 4.7 3.0 Yes
nullptr 2010 4.6 3.0 Yes, but use decltype(nullptr) instead of std::nullptr_t.
enum foo : int16_t {}; 2008 4.4 2.9 Yes
enum class foo {}; 2012 4.4 2.9 Yes
enum foo; 2012 4.6 3.1 Yes
[[attributes]] 2015 4.8 3.3 No (see notes)
constexpr 2015 4.6 3.1 Yes
alignas 2015 4.8 3.3 Yes
alignof 2015 4.8 3.3 Yes, but see notes ; only clang 3.6 claims __has_feature(cxx_alignof)
Delegated constructors 2013 4.7 3.0 Yes
Inherited constructors 2015 4.8 3.3 Yes
explicit operator bool() 2013 4.5 3.0 Yes
char16_t/u"string" 2015 4.4 3.0 Yes
R"(string)" 2013 4.5 3.0 Yes
operator""() 2015 4.7 3.1 Yes
=delete 2013 4.4 2.9 Yes
=default 2013 4.4 3.0 Yes
unrestricted unions 2015 4.6 3.1 Yes
for (auto x : vec) 2012 4.6 3.0 Yes (be careful about the type of the iterator)
override/final 2012 4.7 3.0 Yes
thread_local 2015 4.8 3.3 No (see notes)
function template default arguments 2013 4.3 2.9 Yes
local structs as template parameters 2010 4.5 2.9 Yes
extended friend declarations 2010 4.7 2.9 Yes
0b100 (C++14) 2015 4.9 2.9 No
Tweaks to some C++ contextual conversions (C++14) 2013 4.9 3.4 No
Return type deduction (C++14) 2015 4.9 3.4 No
Generic lambdas (C++14) 2015 4.9 3.4 No
Initialized lambda captures (C++14) 2015 4.9 3.4 No
Digit separator (C++14) 2015 4.9 3.4 No
Variable templates (C++14) 2015u2 5.0 3.4 No
Relaxed constexpr (C++14) 2017 5.0 3.4 No
Aggregate member initialization (C++14) 2017 5.0 3.3 No
Clarifying memory allocation (C++14) 2017 3.4 No
[[deprecated]] attribute (C++14) 2015 4.9 3.4 No
Sized deallocation (C++14) 2015 5.0 3.4 No (see notes for clang)
Concepts (Concepts TS) 6.0 No
Inline variables (C++17) 7.0 3.9 No
constexpr_if (C++17) 2017.3 7.0 3.9 No
constexpr lambdas (C++17) 2017.3 No

Sources

GCC: https://gcc.gnu.org/projects/cxx-status.html
Clang: http://clang.llvm.org/cxx_status.html
MSVC: https://docs.microsoft.com/en-us/cpp/visual-cpp-language-conformance

Notes

rvalue references: Implicit move method generation cannot be used.

Attributes: Several common attributes are defined in mozilla/Attributes.h or nscore.h.

Alignment: Some alignment utilities are defined in mozilla/Alignment.h. /!\ MOZ_ALIGNOF and alignof don't have the same semantics. Be careful of what you expect from them.

Thread locals: There is a thread-local variable helper in mozilla/ThreadLocal.h. In addition, the native thread_local of MSVC2015 may break Windows XP support. See bug 1204752. The native thread_local of clang may break OSX 10.6, too, but support for OSX 10.6 has been retired.

C++14: C++14 is not enabled on compilers that support it.

Clang 3.7 and later require passing -fsized-deallocation to the compiler to activate the sized deallocation feature.

C++ and Mozilla standard libraries

The Mozilla codebase contains within it several subprojects which follow different rules for which libraries can and can't be used it. The rules listed here apply to normal platform code, and assume unrestricted usability of MFBT or XPCOM APIs.

The rest of this section is a draft for expository and exploratory purposes. Do not trust the information listed here.

What follows is a list of standard library components provided by Mozilla or the C++ standard. If an API is not listed here, then it is not permissible to use it in Mozilla code. Deprecated APIs are not listed here. In general, prefer Mozilla variants of data structures to standard C++ ones, even when permitted to use the latter, since Mozilla variants tend to have features not found in the standard library (e.g., memory size tracking) or have more controllable performance characteristics.

Data structures

Name Header STL equivalent Notes
nsAutoTArray nsTArray.h   Like nsTArray, but will store a small amount as stack storage
nsAutoTObserverArray nsTObserverArray.h   Like nsTObserverArray, but will store a small amount as stack storage
mozilla::BloomFilter mozilla/BloomFilter.h   Probabilistic set membership (see Wikipedia)
nsClassHashtable nsClassHashtable.h   Adaptation of nsTHashtable, see XPCOM hashtable guide
nsCOMArray nsCOMArray.h   Like nsTArray<nsCOMPtr<T>>
nsDataHashtable nsClassHashtable.h std::unordered_map Adaptation of nsTHashtable, see XPCOM hashtable guide
nsDeque nsDeque.h std::deque  
mozilla::EnumSet mozilla/EnumSet.h   Like std::set, but for enum classes.
nsInterfaceHashtable nsInterfaceHashtable.h std::unordered_map Adaptation of nsTHashtable, see XPCOM hashtable guide
nsJSThingHashtable nsJSThingHashtable.h   Adaptation of nsTHashtable, see XPCOM hashtable guide
mozilla::LinkedList mozilla/LinkedList.h std::list Doubly-linked list
nsRefPtrHashtable nsRefPtrHashtable.h std::unordered_map Adaptation of nsTHashtable, see XPCOM hashtable guide
mozilla::SegmentedVector mozilla/SegmentedVector.h std::deque Doubly-linked list of vector elements
mozilla::SplayTree mozilla/SplayTree.h   Quick access to recently-accessed elements (see Wikipedia)
nsTArray nsTArray.h std::vector  
nsTHashtable nsTHashtable.h std::unordered_map See XPCOM hashtable guide, you probably want a subclass
nsTObserverArray nsTObserverArray.h   Like nsTArray, but iteration is stable even through mutation
nsTPriorityQueue nsTPriorityQueue.h std::priority_queue Unlike the STL class, not a container adapter
mozilla::Vector mozilla/Vector.h std::vector  

Untranslated notes:

ns*String - too complicated to explain

Safety utilities:
mozilla::Array mfbt/Array.h (safe array index)
mozilla::AssertedCast mfbt/Casting.h (casts)
mozilla::CheckedInt mfbt/CheckedInt.h (avoids overflow)
nsCOMPtr xpcom/glue/nsCOMPtr.h (~= std::shared_ptr)
mozilla::EnumeratedArray mfbt/EnumeratedArray.h (mozilla::Array, for enum types)
mozilla::RangedPtr mfbt/RangedPtr.h (prevents out-of-bounds)
mozilla::RefPtr mfbt/RefPtr.h (~= std::shared_ptr)
nsRefPtr xpcom/base/nsRefPtr.h (~= std::shared_ptr)
StaticRefPtr xpcom/base/StaticPtr.h (nsRefPtr w/o static constructor)
mozilla::UniquePtr mfbt/UniquePtr.h (~= std::unique_ptr)
mozilla::WeakPtr mfbt/WeakPtr.h (~= std::weak_ptr)
nsWeakPtr xpcom/base/nsWeakPtr.h (~= std::weak_ptr)

Algos:
mozilla::BinarySearch mfbt/BinarySearch.h
mozilla::BitwiseCast mfbt/Casting.h (strict aliasing-safe cast)
mozilla/MathAlgorithms.h (rotate, ctlz, popcount, gcd, abs, lcm)
mozilla::RollingMean mfbt/RollingMean.h ()

Misc:
mozilla::AlignedStorage mfbt/Alignment.h (replacement for std::aligned_storage)
mozilla::Atomic mfbt/Atomic.h (replacement for std::atomic)
mozilla::CondVar xpcom/glue/CondVar.h
mozilla::Maybe mfbt/Maybe.h (std::optional)
mozilla::MaybeOneOf mfbt/MaybeOneOf.h (~mozilla::Maybe<union {T1, T2}>)
mozilla::Monitor xpcom/glue/Monitor.h
mozilla::Mutex xpcom/glue/Mutex.h
mozilla::Pair mfbt/Pair.h (~= std::tuple<T1, T2> -- minimal space!)
mozilla::ReentrantMonitor xpcom/glue/ReentrantMonitor.h
mozilla::StaticMutex xpcom/base/StaticMutex.h
mozilla::TimeStamp xpcom/ds/TimeStamp.h (~= std::chrono::time_point)

mozilla/ArrayUtils.h
mozilla/Compression.h
mozilla/Endian.h
mozilla/FloatingPoint.h
mozilla/HashFunctions.h (~= std::hash)
mozilla/Move.h (std::move, std::swp, std::Forward)
mozilla/PodOperations.h (C++ versions of memset, memcpy, etc.)
mozilla/TypeTraits.h (replacement for <type_traits>)

A list of approved STL headers is maintained in config/stl-headers.

Document Tags and Contributors

 Last updated by: upsuper,