mutable
When you declare a member function as const, it means the function is not allowed to modify any member variables of the object (except those declared as mutable).
mutablecan only be applied to non-static and non-const data members.- It is typically used for caches, reference counts, logging info, etc.
mutableonly affects const member functions or const objects; in non-const contexts, it behaves like a normal member.
noexcept
the noexcept keyword is used to specify whether a function is guaranteed not to throw exceptions. It is part of the exception specification system, introduced more formally in C++11 and enhanced in C++17 and beyond. If the compiler knows a function won’t throw, it can generate more efficient code.
If a function marked noexcept does throw, std::terminate() is called.
Usage
void func1() noexcept;
// in conditional form
void func2() noexcept(noexcept(other_func()));
When a std::vector grows and needs to reallocate its storage (e.g., push_back or emplace_back), it must move or copy its elements to the new memory. If the element type has a move constructor that is noexcept, the std::vector will use it. If not, and only a copy constructor is available (it’s safer), the std::vector will use the copy constructor instead.
Whether the default constructor generated by compiler is marked noexcept depends on whether moving all the members is noexcept.