Пустой std::string в инициализаторе статического метода

Я использую статический метод для инициализации константных полей класса. Статический метод использует некоторые константные переменные, которые хранятся в отдельном заголовочном файле. Примитивные типы правильно передаются статическому методу, но std::strings передаются пустыми. Я не могу понять, почему это так.

После некоторых поисков я наткнулся на то, что называется фиаско статического инициализатора, но у меня возникают проблемы с обхватыванием головы, и я не могу понять, виноват ли он. Поскольку объект находится в глобальной области видимости, является ли проблема в том, что он "настраивается" до того, как класс std:: string был "настроен"?

Я попытался воспроизвести минимальный пример ниже:

// File: settings.hpp
#include <string>
const std::string TERMINAL_STRING "Printing to the terminal";
const std::string FILE_STRING "Printing to a file";


// File: printer.hpp
#include <string>
#include <iostream>

class Printer
{
    private:
        const std::string welcomeMessage;
        static std::string initWelcomeMessage(std::ostream&);

    public:
        Printer(std::ostream&);
}

extern Printer::print;


// File: printer.cpp
#include "settings.hpp"

std::string Printer::initWelcomeMessage(std::ostream &outStream)
{
    if (&outStream == &std::cout)
    {
        return (TERMINAL_STRING);
    }
    else
    {
        return (FILE_STRING);
    }
}

Printer::Printer(std::ostream &outStream) :
    message(initWelcomeMessage(outStream)
{
    outStream << welcomeMessage << std::endl;

    return;
}


// File: main.cpp
#include "printer.hpp"

printer print(std::cout);

int main()
{
    return (0);
}

Спасибо большое!

1 ответ

Решение

Поскольку объект находится в глобальной области видимости, является ли проблема в том, что он "настраивается" до того, как класс std::string был "настроен"?

Да.

Ваши строки должны быть функциональнымиstatics, возвращается по ссылке из некоторой функции.

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

Другие вопросы по тегам