4

私は物事のイテレータを持っています。現在のアイテムをアイテムへのポインターに変換したい場合、なぜこれが機能するのですか:

thing_pointer = &(*it);

しかし、これはそうではありません:

thing_pointer = reinterpret_cast<Thing*>(it);

これは、私が理解しようとしているコンパイラ エラーです: http://msdn.microsoft.com/en-us/library/sy5tsf8z(v=vs.90).aspx

念のため、イテレータの型はstd::_Vector_iterator<std::_Vector_val<Thing,std::allocator<Thing> > >

4

5 に答える 5

11

&(*it);

これ*は、論理的に意味することを行うためにオーバーロードされます。イテレータ型をそのポイント先のオブジェクトに変換します。その後、このオブジェクトのアドレスを安全に取得できます。

一方、

reinterpret_cast<Thing*>(it);

itオブジェクトを文字通りポインターとして再解釈するようにコンパイラーに指示しています。しかし、それはまったくポインターではないかもしれません。ご存知のように、50 バイトの構造体かもしれません! その場合、その最初のsizeof (Thing*)バイトが意味のあるものを指すことは絶対にありません。

ヒント:reinterpret_cast<>ほとんどの場合、これは間違っています。

于 2013-10-24T15:16:20.923 に答える
4

必須の標準引用符、強調鉱山:

5.2.19 キャストの再解釈

1/ [...] reinterpret_cast を使用して明示的に実行できる変換を以下に示します。reinterpret_cast を使用して他の変換を明示的に実行することはできません。

4/ ポインターは、それを保持するのに十分な大きさの任意の整数型に明示的に変換できます。[...]

5/ 整数型または列挙型の値は、明示的にポインターに変換できます。[...]

6/ 関数ポインターは、異なる型の関数ポインターに明示的に変換できます。[...]

7/ オブジェクト ポインターは、異なる型のオブジェクト ポインターに明示的に変換できます。[...]

8/ 関数ポインターからオブジェクト ポインター型への変換、またはその逆は、条件付きでサポートされています。[...]

9/ null ポインター値 (4.10) は、宛先型の null ポインター値に変換されます。[...]

10/ [...] 「T1 型の X のメンバーへのポインター」は [...] 「T2 型の Y のメンバーへのポインター」に明示的に変換できます [...]

11/ A [...] 型「T1 へのポインター」の式を reinterpret_cast を使用して「T2 へのポインター」型に明示的に変換できる場合、T1 を「T2 への参照」型にキャストできます。[...]

4/、5/、および 11/ に記載されている整数からポインターへの変換、および値から参照への変換を除いて、使用できる変換reinterpret_castはポインターからポインターへの変換のみです。

ただし、次の場合:

thing_pointer = reinterpret_cast<Thing*>(it);

itポインターではなく、オブジェクトです。このオブジェクトは、多くの点でポインターをエミュレートするように設計されていますが、それでもポインターではありません。

于 2013-10-24T15:32:06.890 に答える
2
  1. *iterator の演算子はオーバーロードされており、それが指すオブジェクトへの参照を返すためです。
  2. で強制できますthing_pointer = *(reinterpret_cast<Thing**>(&it));。しかし、それは未定義の動作です。
于 2013-10-24T15:14:52.903 に答える
2

イテレータはポインタではないためです。これは実装定義の構造体のクラスであり、それをポインターに再解釈しようとすると、イテレーター クラスの生データはメモリー ポインターとして取得されます。

于 2013-10-24T15:15:03.660 に答える
2

最初はオブジェクトへの参照を取得し、次にそのアドレスを取得してポインターを与えます。

2 番目は、反復子をポインターにキャストしようとしますが、ほとんどの型はポインターにキャストできないため、失敗する可能性があります。変換演算子を持つ他のポインター、整数、およびクラス型のみです。

于 2013-10-24T15:17:55.850 に答える