[810] Re:左辺値としての配列名
投稿者:774RR
2007/02/20 02:13:25
なんとなくネタ的に面白いので追加検証。gcc ならソースコードがあるので読んでみた。
gcc-3.4.5 を追っかけ。 gcc-4 では大幅な変更が入っているので変わっているかもしれない。
int array[1];
array=0;
なるソースコードに対する挙動
C の場合 gcc/c-typeck.c Line 3677 でエラーメッセージを出力
これは convert_for_assignment() 関数の末尾である。この関数の先頭部分で
if (TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
|| TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE)
rhs = default_conversion (rhs);
なるコードが実行されている(すなわち右辺はデフォルト変換が実施されている)
のに対して左辺のデフォルト変換を行うコードは見当たらない。
=代入式の左辺においては「配列名を先頭へのポインタに読み替える」変換は実施していない
C++ の場合 gcc/cp/typeck.c Line 5295 でエラーメッセージを出力
これは build_modify_expr() 関数の一部であり
if (TREE_CODE (lhstype) == ARRAY_TYPE)
の内側にある。この例では右辺左辺の型が異なるのでこのエラー。
もし array=array; であるなら、型一致なのでこの行ではなく先に進んで
ISO C++ forbids assignment of arrays エラーが発生。
いずれにせよ左辺のデフォルト変換を行う関数は呼ばれていない。