‘reference’ typedefはどのくらい正確に動作しますか?

STLコンテナには、多くの場合、 bool
のコンテナを参照しているリファレンスおよび const_reference
typedef 私が考えることができる唯一の例外である)は、

typedef value_type& reference;
typedef const value_type& const_reference;

しかし、これらの型のセマンティクスは正確に何ですか?

私が理解しているところから、彼らは「価値タイプへの参照のように振る舞う」と思われますが、それはどういう意味ですか?

MSDNによると、 reference は次のとおりです:

ベクトルに格納された要素への参照を提供する型。

しかし、これはどういう意味ですか?特定の演算子に過負荷をかける必要があるのか​​、特定の動作が必要なのか?もしそうなら、必要な行動は何ですか?

ベストアンサー

私は疑問の一部が、アロケータが有用であるという前提から来ていると思います。アロケータ(少なくともC ++
11以前)は、 STL

人々はコンテナがメモリモデルに依存しないことを望んでいました。これは、言語にメモリモデルが含まれていないためにやや大きかったです。人々は、図書館が記憶モデルを抽象化するための何らかのメカニズムを提供することを望んでいた以前のバージョンのSTLでは、コンテナのサイズは
size_t 型の整数として表現でき、2つのイテレータ間の距離は
ptrdiff_t
型であると仮定していました。そして今、私たちは言われました、なぜあなたはそれを抽象化していませんか?それは、その言葉がそれから抽象的ではないので、高価な注文です。
CおよびC
++配列は、これらの型によってパラメータ化されません。我々はメモリモデルに関する情報をカプセル化する「アロケータ」と呼ばれるメカニズムを発明しました。それは図書館のすべての構成要素に重大な結果をもたらしました。どのメモリモデルがアルゴリズムやコンテナインターフェイスと関係しているのか疑問に思うかもしれません。
size_t のようなものを使用できない場合は、異なるポインタタイプ( T *
T)のために T * 巨大な*
など)。異なる参照モデルを持つ異なるメモリモデルがあるため、参照を使用することはできません。図書館には大きな影響がありました。

残念ながら、それらは標準以下と判断されました

インテルのメモリアーキテクチャに対処するためのアロケータを発明しました。理論的には、ポインタ、参照、
ptrdiff_tsize_t
など、すべてのメモリをカプセル化したレイヤーを持っています。残念ながら、実際には動作しません。たとえば、

vector a(...);
vector b(...);

あなたは今言うことができません:

find(a.begin(), a.end(), b[1]);

b[1] returns a alloc2::reference and
not int&. It could be a type mismatch. It is necessary
to change the way that the core language deals with references to
make allocators really useful.

The reference typedef is meant to return whatever
the equivalent of T& is for the allocator in question.
On modern architectures, this is probably T&. However,
the assumption was that on some architectures it could be something
different (e.g., a compiler targeting an architecture with “near”
and “far” pointers might need special syntax for “near” and “far”
references). Sadly, this brilliant idea turned out to be
less-than-brilliant. C++11 makes substantial changes to allocators
— adding scoped allocators — and the memory model. I have to
admit I don’t know enough about C++11’s changes w.r.t. allocators
to say if things get better or worse.


Looking at the comments on the original question, since the
Standard does not actually state how the containers must be
implemented (although the Standard does put so many requirements on
the behavior of the containers that it might as well …), whatever
type you typedef as reference must have the behaviors
of T& that somebody could potentially rely on when
implementing the container: an object of type
reference should be a transparent alias to the
original object, assigning to it should change the value of the
original object without slicing, there is no need to support
“reseating” the reference, taking the address of the
reference should return the address of the original
object, etc. If at all possible, it should in fact be
T&

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です