web-dev-qa-db-ja.com

C ++のコンテナーに(ポインターではなく)参照を格納できないのはなぜですか?

私のプログラムにはSTLセットがあります。

set<string> myStrings;

コードの効率を向上させるために、ポインターのみを保持するように変更しました。 (実際の文字列のコピーを保存する必要はありません。)

set<string*> myStrings;

可能であれば、ポインタを参照に置き換えることをお勧めします。 (もちろん、ポインターの実際の機能が必要ない場合のみ。)

set<string&> myStrings;

ただし、後者の場合、コンパイラエラーが多く発生します。参照をコンテナ要素として使用できないのはなぜですか?

27
Julian Lettner

コンテナストアオブジェクト。参照はオブジェクトではありません。

C++ 11仕様には、次のように明確に記載されています(§23.2.1[container.requirements.general]/1)。

コンテナは、他のオブジェクトを格納するオブジェクトです。

45
James McNellis

「理由」とは直接関係ありませんが、これを実行したいという暗黙の欲求に答えるために、c ++ 11標準ライブラリにはこれを有効にする std :: reference_wrapper があることに言及します。暗黙的に参照に変換可能であり、標準のコンテナーに格納できます。

13
Tim Seguine

コンテナはオブジェクトを格納し、参照はオブジェクトではないため。 c ++ 11を使用している場合は、std :: reference_wrapperを使用して、割り当て可能なオブジェクトに物事をラップできます。

http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

std :: reference_wrapperは、コピー可能で割り当て可能なオブジェクトで参照をラップするクラステンプレートです。これは、通常は参照を保持できない標準コンテナ(std :: vectorなど)内に参照を格納するメカニズムとして頻繁に使用されます。

2
Learner