24

次のコードは未定義の動作を呼び出しますか?

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再割り当てします。しかし、代入後は参照が使われなくなっているので、コードは大丈夫だと思います。ただし、標準ライブラリ は、上記が未定義の動作になるような方法で自由に実装できますか?ABstd::visit

4

1 に答える 1