以下代码是否会调用未定义行为?
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
呢?
应等同于
vis(get </ * active member * />(variant))`,但我对阅读标准的信心还不足以确定。 - Justin