Trying to learn noexcept, constexpr, etc. in C++ which I've neglected learning for so long. It wasn't taught at school either (well, neither was most of actual C++ except cin and cout and the rest being C primarily, but I didn't know the difference back then when I considered Turbo C/C++ OP). So, I'm learning through practice and cppreference examples. I know a little about them as I've read about many of these keywords in the past but I've never practiced using them until now.

My questions (some of them, I believe I know the answer to, but there's no harm in making sure if I'm right and some of them that are probably stupid):

(1) If I have a base class containing implementations and another class that inherits from it providing an interface, do I qualify the ctors of the interface class and utility functions as noexcept (because they don't actually throw any exceptions, in the case where base class does all the exception handling) or do I handle any exception raised and rethrow it for the end use to manage it?

(2) If a class contains an object of another class (let's say vector), and it happens to throw an exception due to the end users mistake (but my code is what is processing the end user's request to do anything), do I have to handle the exception and rethrow it or can I just let it be?

(3) When is it really important to specify noexcept? Even for non-throwing functions(/...etc), not qualifying them with noexcept will make them potentially throwing functions(/...etc) but that wouldn't matter if they don't raise any exceptions at all.

(4) Is noexcept simply syntax sugar sort of thing? Well, it does guarantee the called function(/...etc) will not throw any exceptions but I don't think it hurts even if there's a non-throwing function unqualified with noexcept. What's exactly will it help in?

(5) If there's a templated implementation of some sort that has 'T' as type and in the implementation, if there exist code like "if (typeid(T) equals typeid(double))" for different primitive types, will it be considered bad practice. I think yes because this can simply be done in a different and more obvious and intuitive way.

(6) If a class implementation does not want to have objects being created at runtime, only then should its ctors be qualified with constexpr?

(7) Does using a "using namespace" directive inside another namespace affect the end user? If I had a "using namespace std;" somewhere inside another namespace "namespace X" and the user does something like "using namespace X;", std does not end up getting used too, right? I tried some code and this holds true. Although, is it good practice to have using directives inside namespaces? I think yes, why not? Simplifies a lot of code and makes it readable as long as there's no naming clashes between multiple to-be-used namespaces.

(8) Can I, in general, specify a function that performs some utility action as constexpr? I think not, but I don't know why.

(9) When will C++20 become a thing? I've read about many new concepts being introduced, making it something Java-like with things like "requires Comparable <T>", etc. I've read that it's great and would like to stay updated on the new developments so that I don't struggle like I'm struggling now.

(10) constexpr replaces every usage of macros (not just compile time constants but even "function" like macros) completely? I think yes, and would like any counter-example if possible.

(11) If Q10 is true, will we be seeing the entire STL being re-written with constexpr statements instead of the define configurations?

(12) When is it good to specify a dtor as noexcept?

(13) If I have a class which contains an object of another class whose dtor is not noexcept, but my class doesn't really throw any exceptions, should I be the one handling that exceptions and rethrowing it to the user. I believe this is similar to another question asked above.

(14) Is it good style for an implementation class to contain all sorts of utility functions and then have an interface class access them as needed, or, is it better to let the interface class handle utility functions? Let's say I have in my implementation class a index [] operator overload and I also want to provide an at () function that does exactly the same as [], do I implement at () as an implementation class feature and let the interface class access it or do I simply write utility code only for the interface class? I think the latter is better because the implementation class should consist strictly only the necessary implementations. Is it just a matter of style?

I apologise if some questions are stupid or if I haven't conveyed what I wanted to clearly in some questions or if my english went haywire somewhere.

Thank you very very much