14

std::variant「例外による無価値」と呼ばれる状態に入ることができます。

私が理解しているように、これの一般的な原因は、移動割り当てが例外をスローした場合です。バリアントの古い値が存在することは保証されておらず、意図した新しい値も存在しません。

std::optionalただし、そのような状態はありません。cppreference は大胆な主張をしています:

例外がスローされた場合、*this ... の初期化状態は変更されません。つまり、オブジェクトに値が含まれていた場合は、まだ値が含まれており、その逆も同様です。

std::optional「例外による無価値」になることをどのように回避できstd::variantますか?

4

3 に答える 3

5

「例外による値なし」とは、バリアントに格納されている型を変更する必要がある特定のシナリオを指します。そのためには、1) 古い値を破棄してから、2) その場所に新しい値を作成する必要があります。2) が失敗した場合、元に戻る方法はありません (委員会が受け入れられないほどの過度のオーバーヘッドがなければ)。

optionalこの問題はありません。含まれているオブジェクトに対する何らかの操作で例外がスローされた場合は、それで問題ありません。オブジェクトはまだそこにあります。これは、オブジェクトの状態がまだ意味があることを意味するものではありません。それは、スロー操作がそれを残すものです。うまくいけば、その操作には少なくとも基本的な保証があります。

于 2019-08-28T16:03:14.430 に答える