You'll have to avoid (or handle and recover from the potential failures of) the following language constructs:
dynamic_cast
to a reference type, which will throw std::bad_cast
if the conversion fails;
typeid
applied to the result of dereferencing a potentially null pointer, which will throw std::bad_typeid
And of course you'll have to avoid much of the standard library. In particular, things like containers use allocators that can only signal failure by throwing.
You'll struggle to give a no-throw guarantee across "a codebase" (if, by that, you mean the code for a whole program or library), since there will typically be operations that can be expected to fail; these can have at most a strong guarantee.