строковая константа c ++ и статический порядок инициализации фиаско - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь понять, когда фиаско статического порядка инициализации является реальной проблемой.Если я использую строковую константу наподобие kName ниже, не будет ли у нее каких-либо проблем с фиаско статического порядка инициализации?Это проблема в этом случае, потому что экземпляр Derived может быть создан до инициализации kName как в main.cpp?

// Base.cpp
namespace test {
class Base {
public:
  virtual ~Base() = default;

protected:
  explicit Base(const std::string &name);
};
} // namespace test

// Derived.cpp
namespace test {
static const std::string kName = "my name";

class Derived : public Base {
public:
  Derived() : Base(kName) {}
  ~Derived() override = default;
};
} // namespace test

// main.cpp
int main() {
  test::Derived instance{};
  return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

В пределах конкретной единицы перевода порядок инициализации статических объектов гарантированно будет порядком, в котором определения объектов появляются в этой единице перевода.Порядок уничтожения гарантированно будет обратным порядку инициализации. Однако, нет никакой гарантии относительно порядка инициализации статических объектов в единицах перевода .Это то, что называется фиаско статического порядка инициализации.

Так что здесь у вас не будет статического фиаско порядка инициализации.

0 голосов
/ 07 февраля 2019

Функция main не будет вызываться до тех пор, пока не будут инициализированы все «глобальные» переменные.Это включает в себя static переменные-члены, а также переменные в области действия namespace (static или нет).

Так что в этом случае это не проблема, так как вы определяете instance внутри функции main.

Было бы иначе, если бы определение instance было сделано статически вне функции main.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...