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?

Was it helpful?

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top