Переместить временный объект за пределы функции-члена - PullRequest
0 голосов
/ 04 июня 2018

Вот что я хочу создать:

class Theme
{
    public:
        Theme();

        bool isValid() const;

        QString name() const;

    private:
        QString m_name;
};

class ThemeManager
{
    public:
        ThemeManager();
        ~ThemeManager();

        void setCurrentTheme(const Theme& theme);
        const Theme& currentTheme() const;

        const Theme& theme(const QString& name) const;

    private:
        Theme& m_currentTheme;
        QSet<Theme> m_availableThemes;
};

Вот сложная часть:

const Theme& ThemeManager::theme(const QString& name) const
{
    for (const Theme& theme : m_availableThemes)
    {
        if (name == theme.name())
        {
            return theme;
        }
    }

    return Theme();
}

Вот чего я хочу достичь:

ThemeManager m;

const Theme& t = theme("monokai");
if (t.isValid()) {
    // Theme is valid
} else {
    // Theme is not valid
}

ThemeManagers хранит список тем и ссылку на текущую.Я хочу использовать ссылки вместо указателей.Теперь, если запрашиваемая тема отсутствует в списке тем менеджера, я хотел бы вернуть ссылку на недопустимую, которую я могу проверить с помощью Theme::isValid.Я не хотел бы использовать отдельный член, например Theme m_invalidTheme; только для этой цели.

Мой вопрос: нет ли способа переместить временный объект наружу из области действия ThemeManager::theme?Так что t из t.isValid() не является висячей ссылкой, которая нарушает код?

...