问题
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?
回答1:
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.
回答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.
来源:https://stackoverflow.com/questions/790687/using-a-free-char-const-at-static-initialization-time