2012-03-20 1 views
10

次の簡単なプログラムスニペットでは、gcc-4.3.4でコンパイルエラーが発生します。整形式コードを指定せずに動的配列を割り当てていますか?

プログラム:

int main() 
{ 
    char *ptr = new char[10];  
    char *ptr1 = new char[];  
    return 0; 
} 

コンパイルエラー:

prog.cpp: In function ‘int main()’:
prog.cpp:4: error: expected primary-expression before ‘]’ token
prog.cpp:3: warning: unused variable ‘ptr’
prog.cpp:4: warning: unused variable ‘ptr1’

しかし、同じことは、診断メッセージを表示せずにMSVCできれいにコンパイルします。

だから私の質問は次のとおりです。
標準new []sizeを指定せずに呼び出すことができますか?またはこれはMSVCのバグですか?
誰かが、上記のコード例が不正であるか整形式であると結論づける標準からの参照を提供できますか?

5.3.4新しい[expr.new] &
18.4.1.2配列形式[lib.new.delete.array]

:私は見て持っていた


しかし、行動に関する決定的な証拠は見つかりませんでした。


EDIT:
Language Lawyerタグを追加します。
有用かどうかにかかわらず、観察された動作の答えを期待していますが、私はそれが有用でも推奨でもないことを十分に認識しています。

+1

合法であれば、私はそれのポイントを見ません... – Mehrdad

+2

私はそれがどのようによく形成されたコードであるかわかりません?コンパイラは何をしようとしていますか、サイズを推測しますか?それはむしろ(不可能ではないにしても)難しいようです。 – Corbin

+3

+1、面白い、良い答えを待っている。 – ApprenticeHacker

答えて

4

これは構文上正しいものではありません。

の新しい表現については、syntaxをご覧ください。

noptr-新宣言子は、角括弧の間表現を含まなければならない、と表現はそれにトークンを持っている必要があります。

4

これは法的なC++ではありません。

5.3.4新しい[expr.new]この行を含む大きなリストに新しいを呼び出すための法的な方法であるかを示しています

noptr-new-declarator: 
     [ expression ] attribute-specifier-seqopt 
     noptr-new-declarator [ constant-expression ] attribute-specifier-seqopt 

、後でそれが(定数式であることができるかについて説明します5.4.3/6および5.4。3/7):

Every constant-expression in a noptr-new-declarator shall be an integral constant expression (5.19) and evaluate to a strictly positive value.


いくつか考えた後、次の項目がrelavantすべきである:

8.3.4/1 [dcl.array]、これらの部品:

In a declaration T D where D has the form

D1 [ constant-expressionopt ] attribute-specifier-seqopt 

and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T”, then the type of the identifier of D is an array type;

および

if the constant expression is omitted, the type of the identifier of D is “derived-declarator-type- list array of unknown bound of T”, an incomplete object type.

5.3.4/1伝えます:

This type shall be a complete object type, but not an abstract class type or array thereof

あなたは配列のサイズを省略しているので、型が完全ではない、とあなたのプログラムが有効なC++ではありません。

+0

最初の行にははどうだろう? は、多次元配列用です。例えば、 'x = new char [plop * 5/* expression * /] [10/* const-expression * /] [100/* const-expression * /]' –

+0

ちょっと一目見れば、は空ですが? –

+0

@ LokiAstariそのため、* constant-expression *を編集できるように追加しました。* noptr-new-declaratorのすべての定数式は整数定数式*となります。問題では省略されているので、標準のC++ではなくコンパイラの拡張機能です。それはコンパイルされて以来、UBではありませんが、そうしてはいけません。 –

関連する問題