0

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

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

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

4

1 回答 1

1

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

您创建一个函子,它引用一个变量。美好的。之后,您使用对该 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! ##
}
于 2020-04-29T10:38:17.483 回答