3

マップからオプションの値を返す関数を取得しようとしています。だから、このようなもの:

boost::optional<V> findValue(const K& key) {
    boost::optional<V> ret;
    auto it = map.find(key);
    if (it != map.end()) {
        ret = it->second;
    }
    return ret;
}

Vたまたまshared_ptrある種の型である場合ret、参照カウントをトリガーする割り当ては行われますか?

4

2 に答える 2

5

はい、そうしなければなりません。boost::optionalはコピーを格納するため、 のshared_ptr場合、これは のコピーがあるshared_ptrことを意味し、参照カウントを増やす必要があることを意味します。

が空である限りboost::optional、つまり の値を含まない限りshared_ptr、参照カウントが変更されるオブジェクトは存在しないことに注意してください。つまり、空には(空またはその他) が含まれboost::optionalませshared_ptr

要求された「セマンティクス」は実際には機能しません。shared_ptrマップにセマンティクスを保持し、shared_ptr.

ただし、次を返す場合がありますboost::optional<const V&>

boost::optional<const V&> findValue(const K& key) {
    auto it = map.find(key);
    if (it != map.end()) {
        return boost::optional<const V&>( it->second );
    }
    return boost::optional<const V&>();
}

ただし、参照を保持/使用している間は参照が有効であることを確認してください。

于 2013-04-05T16:58:52.667 に答える
1

はい。この場合、オブジェクトに含まれているものをコピー初期化することにより、共有ポインタをコピーするとoptional、使用カウントが増加します。

于 2013-04-05T16:58:29.323 に答える