7

VLA は C++11 の一部ではないことを理解しており、GCC によるこの誤りを見てきました。それが Clang に切り替えた理由の一部です。しかし、今ではClangも見ています。私はclang 3.2(最新のものより1つ遅れています)を使用しており、 -pedanticおよび-std = c ++ 11でコンパイルしています

テストがコンパイルされず、まだコンパイルされて実行されていないことを期待しています。

int myArray[ func_returning_random_int_definitely_not_constexpr( ) ];

これはコンパイラのバグですか、それとも何か不足していますか?

コメントへの応答として、ここに random_int_function() があります

#include <random>
int random_int_function(int i) 
{
    std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(1,100);

    int random_int = distribution(generator);  

    return i + random_int;
}
4

3 に答える 3

0

配列宣言を関数に入れずに、投稿したスニペットをIDEoneにプラグインするだけで、

prog.cpp:12:39: エラー: バインドされた配列は、']' トークンの前の整数定数ではありません

あなたが観察したように、main()その周りに関数を追加すると、成功します。

C++11 では、名前空間スコープでは有効だが名前空間スコープではなく、VLA のプロパティである配列宣言が許可されていないためmain、これが表示されていると結論付けるのが妥当です。

更新: Coliru.org の厚意により、Clang からのメッセージは次のとおりです。

main.cpp:12:9: エラー: ファイル スコープでは可変長配列の宣言は許可されていません

それはかなり明確です。

于 2013-07-15T02:10:57.013 に答える