Using a free “char const*” at static initialization time
-
16-09-2019 - |
Question
Initialization order of free objects is undefined in C++. But what about the following?
namespace foo {
char const* str = "hey";
struct A {
A() { cout << str; }
} obj;
}
Is this still undefined behavior, or is there a special provision for pointers initialized with string literals?
Aside from that: what if str was of type "char const[]"? And if it was a std::string?
Solution 2
The initialisation order is defined - they are initialised in the order they appear in a compilation unit - see section 3.6.2 of the C++ Standard. The type of the things being initialised has no effect.
OTHER TIPS
Even if they would be located in different translation units, the initialisation order is still defined.
That is because str
is initialized with a constant expression (address constant expression
) and str
has pod-type. It would still hold true if you had an array. But it would not be true anymore if you had a std::string
. Those are dynamically initialized (because std::string
is a non-POD).
Thus, if your str
were a std::string
, you would run into undefined behavior if obj
is defined in a different translation unit, but that's the only case of the one you listed that would cause trouble.