2016-10-16 10 views
2

私は厳密エイリアシングルールを知っているように、フレッド・オブジェクトは厳密なエイリアシング規則違反

char memory[sizeof(Fred)] 

ために別のオブジェクト、すなわちのために割り当てられているバッファに新たな配置で構成されています私たちが反対のことをすることを可能にします。すなわち、どんなタイプのオブジェクトでも、char*を指すことが許されています。そして、そのポインタを逆参照して、私たちが望むように使用することができます。

しかし、この例では逆のことが起こっています。私は何が欠けていますか?

+0

私にdownvoteを与えた質問に間違っていますか? – user183833

+2

あまりにも多くのお金が彼らを気にしないです。私は+1を与えた。あなたが立ち往生したときに質問を続けるためにあきらめないでください。ウェブサイトは学習のためのものです。 – snr

+0

時間の経過とともに変更される可能性のある外部リンクを持つ代わりに、あなたが求めているコードを質問に表示するための質問が改善され、いくつかのコードサンプルがあります。 –

答えて

1

Placement-newは新しいオブジェクトを作成します。古いオブジェクトのエイリアスはありません。古いオブジェクト(この例ではcharの配列)は、placement-newが実行されるときに既存のオブジェクトが停止するとみなされます。

プレースメント新しくなる前に、charオブジェクトで満たされたストレージがあります。新しいプレースメントの後には、1つのFredオブジェクトで満たされたストレージがあります。

エイリアシングがないので、厳密なエイリアシングの問題はありません。

+0

この例では、配置後に 'memory'を使用すると、未定義の動作と考えられます。あれは正しいですか? '場所 'はどうですか? – esam

+0

私はそれが未定義ではないと思います。 StoryTellerが上に投稿したスニペットのため。 だから@M。私はそれを得たと思う。一つのことは、誰かが今この関数の外にchar * to memoryを持っていて、その中にFred型のオブジェクトが格納されていることが分かっていた場合です。彼はFred *にそれを再解釈したいと思うだろう。彼がこれを行うことが許可された理由は、この[リンク](http://en.cppreference.com/w/cpp/language/reinterpret_cast)の5のためです。しかし、逆参照するには、そのリンクの下からタイプエイリアシングの箇条書きの1つが正当化するために真実を保持する必要があります。右?はいの場合は? – user183833

+0

この文脈でさえ、これはエイリアシングとしてカウントされませんか? – user183833

2

厳密なエイリアシング規則では、Fred*char*にキャストする必要があるとは言いません。 char*Fred*の変数だけが同じオブジェクトを指し、そのオブジェクトにアクセスするために使用されることがあります。プログラムは、以下のタイプのいずれかの動作より を介して他のglvalueをオブジェクトの記憶された値にアクセスしようとする場合[basic.lval] paragraph 8

を引用

は未定義である。

  • オブジェクトの動的型、

    [..]

  • charまたはunsigned char型。

+0

はい、私がこの例で起こると理解していることは、その反対です。 オブジェクトの値は、タイプFredからアクセスされています。 あなたが投稿したこのスニペットは、他の方向のものです。すなわち Fredオブジェクトがchar型からアクセスしています。 – user183833

+0

また、ここでの「動的型」は継承の観点から参照されていますか? – user183833

+0

@ user183833スニペットはどちらの方向にも適用されません。これらは両方ともこの文脈で有効です。そして、はい、相続の面ではダイナミックです。 – StoryTeller

関連する問題