2017-10-19 8 views
0

私はcharの配列がC++標準で安全に詰め込み可能なタイプであるというこのメモリを持っています。つまり、charの適切に整列されサイズ指定された配列の最初の要素へのポインタがchar*の場合、そのポインタはreinterpret_cast<T*>には安全ですが、たとえば安全ではありません。 uint8_tに準拠する。C++:標準に従って文字配列をペニングするのは特別でしょうか?

しかし、現在のドラフト標準ではどこにも見つかりません。私は間違っていると思いますか?これはC++ 17の変更ですか?誰かが標準の関連部分を引用できますか?

+3

です。 'char'配列には特別なものは何もありません。 'char' *ポインタ*には特別なものがあります。 –

+0

@ n.m。他の方法では(並べ替え)... charポインタについては特別なことは何もありませんが、 'char'の値は特殊です(厳密なエイリアシングに関して)。 –

+0

@ M.Mですが、これらの左辺値はどのように得られますか?ああ、私はあなたが参照を使用できると思います。けっこうだ。 –

答えて

2

Tルールにおける例外の一つではない場合)charの配列を読み書きするタイプTの式を使用する厳密なエイリアシング違反です。

厳密なエイリアシングは双方向の通りではありません。という表現を使用してTにアクセスできますが、逆もありません。

セクションは、C++ 14標準の[basic.lval]/10です。 See hereがあります。

さらに、標準ではuint8_tが別のタイプのtypedefであると記載されています。すべての既知の実装では、charまたはunsigned charのtypedefになっています。

標準では、明示的にuint8_tを文字タイプと指定することを推奨している人もいます。それはまた、uint8_t x = 'a'; cout << x;のような問題もよく定義されていません。

+0

おかげさまで、厳密なエイリアシングルール([draft standard link(http://eel.is/c++draft/basic#lval-8))の 'char'の例外は、私が考えていたものだと思います。 – jacobsa

+0

これは 'std :: aligned_storage'のようなものとどうやって相互作用しますか?確かに 'char'の配列を' T * 'に変換する標準的な安全な方法がありますか?あるいは、これは 'std :: aligned_storage'のような祝福された型を通してのみですか? – jacobsa

+0

@jacobsaは、配置されたストレージまたはchar配列にオブジェクトを作成するために、placement-newを使用します。その領域は、作成された型のオブジェクトとみなされ、配列クラスのオブジェクトなどではなくなりました。 –

関連する問題