Does C++11 give any guarantees about inline functions or methods, when they make calls to other functions declared with the noexcept qualifier?
class My_String { ...
const char * c_str () const noexcept;
inline operator const char * () const { return c_str(); }
};
I assume an optimizing compiler would be free to implement the inline method without full EH and stack unwinding, as per the noexcept qualification. I would also expect this for a simple accessor method too:
... inline operator const char * () const { return m_buffer; }
While this example looks trivial, exception guarantees matter when used to implement other classes or functions. Q: Does the C++11 standard address this or should inline methods be marked noexcept? Or is it better to omit noexcept unless required to match a class or function specification?
Edit: To avoid some confusion: Is noexcept implicit for the inline method?
Sorry, no. The only implicit exception-specifications are
= default;.operator deleteandoperator delete[].[Note that for deallocation functions, an implicit exception-specification is always as if
noexcept(true). For all destructors, and for special member functions which are implicitly declared or explicitly defaulted on the first declaration, the implicit exception-specification can be eithernoexcept(true)ornoexcept(false), as determined from the exception-specifications of the corresponding special member functions of any base classes and members of class type.]So with either example declaration,
noexcept(static_cast<const char*>(std::declval<const MyString>()))must befalse. Go ahead and writenoexceptwhere it might matter.Of course, as you noted, a compiler optimization is still allowed to notice an inline function can’t throw exceptions and simplify exception handling in the caller.