以下代码是否会调用未定义的行为?
std::variant<A,B> v = ...;
std::visit([&v](auto& e){
if constexpr (std::is_same_v<std::remove_reference_t<decltype(e)>,A>)
e.some_modifying_operation_on_A();
else {
int i = e.some_accessor_of_B();
v = some_function_returning_A(i);
}
}, v);
尤其是,当变体不包含A
时,
此代码重新分配了A
,同时仍然保留对先前保存的类型B
的引用。
但是,由于分配后不再使用该参考,
我觉得代码很好。
但是,标准库可以免费实现std::visit
以某种方式使上述行为无法确定?
答案 0 :(得分:17)
代码很好。
std::visit
的规范中没有要求访问者不要更改对其调用的任何变体的替代形式。唯一的要求是:
要求:对于每个有效包
m
,e(m)
应该是有效表达式。所有这些表达式应具有相同的类型和值类别;否则,程序格式不正确。
您的访客是每个m
的有效表达式,并且始终返回void
,因此它满足要求并且行为明确。