John John - 1 month ago 6
C++ Question

Why can creating a static const std::string cause an exception?

I have string constants, for strings that I use in multiple places in my app:

namespace Common{
static const std::string mystring = "IamAwesum";
}


When posting a question about something else (What happens to a .h file that is not included in a target during compilation?), another user made the following comment :


be aware that your static string are global in this case. So they are
could create an exception at anytime and can't be catch. I advise you
to use function who return a reference of your string. std::string
const &mystring { static std::string const mystring = "IamAwesum";
return mystring} by this way your object is only construct when needed


Can someone explain why using static const strings in the manner that I do so above, risks throwing exceptions ?

Answer

N4140 ยง 3.6.2 [basic.start.init]/ 4

It is implementation-defined whether the dynamic initialization of a non-local variable with static storage duration is done before the first statement of main.

If it is done before, you simply cannot catch an exception generated by the string's constructor - say, bad_alloc.

(opinion) That being said, for such small strings I find this kind of consideration to be paranoid.

Comments