導入されたガイドライン サポート ライブラリ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_ptr
unique_ptr
not_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));
}
not_null<unique_ptr<int>>
f() から返された状態の状態は、そこから移動した後にリークできなかったという私の仮定は正しいですか (例として)?not_null<unique_ptr<int>>
g() に渡された状態の状態は、そこから移動した後にリークできなかったという私の仮定は正しいですか (例として)?C++ 14/17 での移動の一般的なケースを禁止しながら、この特別な種類の移動を許可することは可能ですか?