3

多くの作業をしstd::shared_ptrていると、実装が見落とさshared_refれます。これはの特殊化であり、 (もちろん、適切な使用法が与えられshared_ptrた場合)決してラップしないことを保証します。nullptrなぜC++11規格にないのか不思議に思います。それを実施する際に市長の問題はありますか?頭のてっぺんには何も思いつかない。

編集:

私は次のようなインターフェースを期待しています:

template <typename T>
class shared_ref {
public:
  shared_ref( T&& ref );
  T& get();
  T* operator&() const;

  template< class Y > 
  void reset( Y&& obj );

  long use_count() const;
  bool unique() const;

  void swap( shared_ref& r );
};
4

2 に答える 2

3

それを実施する際に市長の問題はありますか?

これが1つです:参照の所有権を取得することはできません。スマートポインタの要点は、ポインタ自体の所有権を主張することです。shared_ref参照の存続期間を制御できないため、機能しません。

いいえ、これも飛ぶことはありません:

shared_ref( T&& ref ) : p(&ref) {}

ユーザーがスタック変数を指定した可能性があります。これは、このオブジェクトとスタック変数の間で所有権を「共有」していることを意味します。また、スタック変数は所有権を何かと共有することはできません。

ポインタの存続期間のみを制御できます。また、ポインタはNULLにすることができます。したがって、実行できるのは、ポインタがNULLかどうかを確認するための実行時チェックだけです。

あなたができる絶対的な最善はshared_ptr、デフォルトのコンストラクターがなく、NULLが与えられた場合にスローすることを除いて、と同等のインターフェースです。まったく新しいポインタ型を作成する価値は本当にありますか?


C ++コアガイドラインサポートライブラリにはnot_nullテンプレートがあり、ほとんどのポインタのようなタイプに適用できます。したがってnot_null<shared_ptr>、ポインタがNULLでないことを確認したい場合に使用できますが、使用に入るときに1回だけ使用できます。ポインタの最初の作成後、再度チェックする必要はありません。

確かに、他の人にそれらを使用させることはできませんが、このタイプを一貫して使用することで問題は解決します。

于 2012-07-06T17:24:48.023 に答える
0

shared_ptraがnullになるには、デフォルトで作成された方法と、ある時点でnull値が割り当てられた方法の2つしかありません。shared_refすでに同意しているので、仮想クラスをデフォルトで構築することは意味がないため、2番目の条件のみが残ります。

オブジェクトにを割り当てようとした場合nullptrshared_ref何が起こると思いますか?エラーをスローする必要がありますか?shared_ptr単純なテンプレート関数を使用して、通常の方法で同じことを行うのは簡単です。

template<typename T>
T* notnull(T* ptr)
{
    if (ptr == std::nullptr)
        throw std::invalid_argument(std::string("nullptr"));
    return ptr;
}

std::shared_ptr<int> pint = notnull(GetIntPtr());

一般に、簡単な回避策のないやむを得ないニーズがない限り、標準に追加されることはありません。

于 2012-07-06T16:52:31.327 に答える