次のコードは未定義の動作を呼び出しますか?
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