std::variant 访问者修改变体的地方

std::variant visitor where the visitor modifies the variant

在访问者函数中修改变量是否安全?

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);
}

在上面例子中的字符串引用函数中,我假设字符串引用在赋值新值之前是有效的。但是标准是否说明了这个用例的有效性?

您的用例没有什么特别之处。

您创建了一个仿函数,它引用了一个变量。美好的。 之后,你调用你的仿函数并引用该 var 的内容。为什么不?在那之后,你修改它。还可以。

您没有破坏您的引用指向的任何内容,并且所有操作的顺序都已明确定义。

如题,答案是:是的,很安全!

你不能做的是在修改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! ##
}