2

なぜこれが機能しないのですか?

struct O {
    O(int i, int j)
        : i(i)
        , j(j)
    {}

    int const i;
    int const j;
};

int main(int argc, char** argv)
{
    boost::optional<O> i;
    i.reset(O(4, 5));
    return 0;
}

代わりに代入演算子を使用しようとしているようです。初期化されていないメモリで O のコピー コンストラクターを呼び出すと想定していました。

/..../include/boost/optional/optional.hpp:433:69: error: use of deleted function ‘O& O::operator=(const O&)’
.... error: ‘O& O::operator=(const O&)’ is implicitly deleted because the default definition would be ill-formed:
.... error: non-static const member ‘const int O::i’, can’t use default assignment operator
.... error: non-static const member ‘const int O::j’, can’t use default assignment operator
4

1 に答える 1

2

Boost.Optional は、の状態に応じて、代入またはコピー構築を使用しますi。この状態は実行時の情報であるため、代入とコピー構築の選択も実行時に行う必要があります。
ただし、これは、コンパイラが両方のオプションのコードを生成する必要があることを意味します。つまり、両方のオプションが可能でなければなりません。

コードを機能させるには、(常に失敗する) 代入演算子を に追加できますclass O

O& O::operator=(const O&)
{
    throw "this is not possible"
    return *this;
}

補足として、Optional<T>::reset非推奨です。次のように、割り当てを使用する必要があります

i = O(4,5);

上記のセマンティクスは両方に有効です。

于 2013-01-17T08:47:36.803 に答える