STD :: Вариант посетителя, где посетитель изменяет вариант - PullRequest
0 голосов
/ 29 апреля 2020

Безопасно ли изменять вариант внутри функции посетителя?

struct visitor {
    visitor(std::variant<int, std::string> & var) : var(var){}

    void operator()(int i) {
        var = std::to_string(i);
    }

    void operator()(const std::string & s) {
        var = atoi(s.c_str());
    }
    std::variant<int, std::string> & var;
};

void convert(std::variant<int, std::string> & var) {
    std::visit(visitor{var}, var);
}

В функции ссылки на строку в приведенном выше примере я предполагаю, что ссылка на строку действительна до присвоения нового значения , Но говорит ли стандарт что-нибудь о действительности этого варианта использования?

1 Ответ

1 голос
/ 29 апреля 2020

В вашем случае нет ничего особенного.

Вы создаете функтор, который принимает ссылку на переменную. Хорошо. После этого вы вызываете ваш функтор со ссылкой на содержимое этой переменной. Почему бы нет? И после этого вы модифицируете его. Также хорошо.

Вы не уничтожаете ничего, на что указывают ваши ссылки, и порядок всех операций четко определен.

Таким образом, ответ таков: Да, это безопасно!

То, что вы не можете сделать, это использовать ссылку на содержимое var после того, как вы измените сам var. Это сделает вашу ссылку недействительной. Но вы больше не используете его, поэтому код четко определен.

Например, в вашем коде:

void operator()(const std::string & s) {
    var = atoi(s.c_str());
    ## don't use "s" anymore, as s is invalidated by assigning a new value to var! ##
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...