2015-11-18 29 views
5

gccg++で次のコードをコンパイルすると、gccではなく、g++にエラーが発生します。コードがint (*)[4]からint (*)[](不完全な配列型へのポインタ)に変換されることに注意してください。 Incomplete array type?で説明したようにCとC++間の不完全な配列ポインタ変換規則の相違

int arr[4]; 
int (*p_arr)[] = &arr; 

C言語は、この変換を可能にします。しかし、なぜC++がこれを許可せず、エラーerror: cannot convert ‘int (*)[4]’ to ‘int (*)[]’ in assignmentを与えるのですか?私はC++がCより型の安全性が高いことを知っていますが、後でポインタの逆参照(例えばsizeof(*p_arr))がCにもエラーを与えるので、この割り当ては本当に型が危険ですか?

+0

後で逆参照することはありますか? – ecatmur

+0

@ecatmur例を使って質問を更新しました – user1969104

+0

@ user2079303あなたのリンクの質問は完全な配列型ではなく、完全型から完全型への変換ではなく、特にこの点では 'c'と' C++ 'の違いです。 – user1969104

答えて

1

変換は安全であるが、この変換を可能にするCに同じルールはまた、反対方向にそれを可能にすることに留意してください。

これは明らかに悪いです。 C++はこのルールを削除しました。int[4]int[]というルールは互換性のあるタイプで、互換性のあるタイプのコンセプトを取り除きました。

特定のコンバージョンは安全ですare being considered for inclusion in a future version of C++それらにはコンバージョンも含まれています。

0

はい、この割り当ては本当にタイプセーフではありません。

C++では、配列型にディメンションが含まれています。常に。

は(主に)それ自体

+0

単に安全でないのはなぜですか? (また、不完全な配列型のパラメータを反例として提供しています。) –

+0

@AlanStokes:安全ではないため、許可されていません。そして、これらの「不完全な配列型のパラメータ」の1つの例を私に見せてもらえますか? –

+0

'void f(int p []);' –