1

導入されたガイドライン サポート ライブラリnot_null<T>の目的は、ポインターのような型に不変条件を適用することです。ただし、動作しない既知の問題です。not_null<unique_ptr<T>>

私が見る限り、その理由はunique_ptr<T>コピー構築可能でnot_null<T>はなく、その T から移動するコンストラクターを持っていないということnot_null<T>です。それは不変であることを壊すため、どちらもデフォルト構築可能ではありません。を構築できたとしても、コピーできず、移動するとnullptrが残るためnot_null<unique_ptr<T>>、意味のある内部に到達することは不可能です。完璧な罠のようです。unique_ptrunique_ptrnot_null<T>

私はnot_null<T>、特定のコンテキスト、つまり範囲外になる直前にあるオブジェクトから合法的に移動できると主張しました。つまり、そこからの移動は、破棄前の最後のアクセスである必要があります。そうすれば、不変式が壊れているオブジェクトは、プログラムの残りの部分から観察できなくなります。not_null(自身のコードでのみ観察可能です。)

次の例では、 から移動できると仮定しnot_null<T>ます。

not_null<unique_ptr<int>> f()
{
    return make_unique<int>(1);
}

void g(not_null<unique_ptr<int>> p)
{
    ...
}

void h()
{
    auto p = f();
    g(make_unique<int>(2));
}
  1. not_null<unique_ptr<int>>f() から返された状態の状態は、そこから移動した後にリークできなかったという私の仮定は正しいですか (例として)?

  2. not_null<unique_ptr<int>>g() に渡された状態の状態は、そこから移動した後にリークできなかったという私の仮定は正しいですか (例として)?

  3. C++ 14/17 での移動の一般的なケースを禁止しながら、この特別な種類の移動を許可することは可能ですか?

4

1 に答える 1

0

1&2: エリシオンが使用する価値のあるコンパイラで問題を意味のないものにするという事実を無視する、はい。また、 「漏れる」ことがunique_ptr できないという事実を無視します。

3:いいえ。

これは、ISO C++ 提案メーリング リストでいくつかの議論の対象となっています。一般的な概念は、オブジェクトから移動する行為とそれを破壊する行為が同じ呼び出しで実行される「破壊的な移動」の概念です。しかし、これは言語機能でなければなりません。C++14 では、指定されたオブジェクトが確実に破棄されるように、移動コンストラクター/代入が呼び出されているかどうかを判断する方法がありません。

于 2016-02-15T23:37:16.543 に答える