なぜこれがClang4.0で機能するのか疑問に思っていました。
unsigned cnt = 42;
int k[cnt];
しかし、これはしません:
unsigned cnt = 42;
string bad[cnt];
C++プライマー第5版をチェックしました。それはそれを言います:
ディメンションはコンパイル時に認識されている必要があります。つまり、ディメンションは定数式である必要があります。
それが本当なら、なぜint k[cnt];
仕事をするのですか?
どちらのスニペットもC++では機能しません。
ただし、Cでは、配列サイズとして非定数式を使用することができます。一部のコンパイラ(たとえば、-pedantic
オプションなしのGCC)は、C++コードでそのC機能をサポートします。
要素タイプの違いについては、コンパイラ固有です。GCCは両方をコンパイルします。この場合、 clang ++は非PODタイプ(などstd::string
)を禁止します。
clang4.0は実際にapplexcodeclangですか?それは実際にはバージョン3.1だと思います。clangはそれ自体が素晴らしい説明を提供します:
warning: variable length arrays are a C99 feature
[-Wvla-extension]
int k[cnt];
どのコンパイラを使用していますか。私はgccを使用しており、constとnonconstの両方が正常に動作します。
これはcの問題ではなく、配列は変数を介して定義されることを意図しておらず、マクロとconst式のみを意味します。
これはコンパイラの解釈の問題であり、標準に関連しているとは思えません。