2

変数をコンパイラで構築された文字列として区別するにはどうすればよいですか?

たとえば、右辺値"Hello, World"の型はconst char*. const char*それ自体は、ポインターを変更できないという意味ではありません。ポインターを変更するchar* constことはできませんが、それはコンパイラーによって構築されるものではありません。

これは、 を保持するコンテナconst char*の場合、C++ の移動セマンティクス以外の方法でデータをコピーする必要があるということですか? コンパイラで構築された文字列を移動し、他のすべての文字列をそのままにしておく方法はありますか?

たとえば、GCC 4.5.2 では、 ではintなく型を返すメソッドは、 を返すint&ものとして扱われint&&ます。実際の標準がこのようになっているかどうかはわかりませんが、GCC が当分の間そうしていることです。

編集:明確にするために、ポインタが指す実際のメモリをコピーする必要があることを意味します。これは、新しいメモリを割り当てる必要があり、ポインターからのデータを新しい場所にコピーする必要があることを意味します。

4

2 に答える 2

9

"Hello, World"タイプではありませんconst char*。それは型const char[13]であり、右辺値ではなく左辺値です。

"Hello, World"初期要素へのポインタに暗黙的に変換されるコンテキストで使用するconst char*と、結果のポインタは右辺値になります (これは暗黙的な変換の結果として生じる一時オブジェクトであるためです。

たとえば、GCC 4.5.2 では、 ではintなく型を返すメソッドは、 を返すint&ものとして扱われint&&ます。

値を返す関数 ( などint) を呼び出す場合、その関数呼び出し式は右辺値式です。左辺値参照 ( など) を返す関数を呼び出す場合int&、その関数呼び出し式は左辺値式です。

変数をコンパイラで構築された文字列として区別するにはどうすればよいですか?

実際にはできません。宣言する可能性 のある"Hello, World"と他のものとの間に違いはありません。const char[13]

const char*s やその他のポインタ型を のような標準ライブラリ コンテナに格納するstd::vector場合、コンテナはポイント先のデータに触れません。コンテナはポインタを作成、移動、コピー、破棄するだけです。

ポイント先のデータを管理する必要がある場合は、ポイント先のオブジェクトを管理するクラスを自分で作成する必要があります (スマート ポインター クラスによく似ています)。このようなリソースを管理するためのクラスを作成するイディオムは、"Resource Acquisition is Initialization" (RAII) または "Scope-Bound Resource Management" (SBRM) と呼ばれます。

于 2011-03-18T00:40:19.530 に答える
0

これは、const char* を保持するコンテナーの場合、C++ の移動セマンティクス以外の方法でデータをコピーする必要があるということですか?

これは、ポインタがコピーされたことを意味します。それ以上でもそれ以下でもありません。コンテナーを機能させるには、ポインターをコピーする必要があります。

于 2011-03-18T00:20:47.207 に答える