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! ##
}
在访问者函数中修改变量是否安全?
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! ##
}