2016-05-18 5 views
12

ネガティブサイズの配列を作成しようとするとエラーが発生します。ネガティブサイズの配列にエラーがありません

#include <array> 

int main() 
{ 
    std::array<int, -1> arr; 
} 

-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTICとエラーは発生しません。これは意図された動作ですか? std::array

+2

を? gcc 5.3.1を使用しました。エラー '変数のサイズ' arr 'が大きすぎます。 –

答えて

8

タイプがある:あなたが-1で2番目のテンプレートパラメータを初期化すると

template< 
    class T, 
    std::size_t N 
> struct array; 

、それは暗黙的にstd::size_tとして非常に大きな値に変換されother answerで指示し、それとして、C++で違法である(unsignedです診断されるべきである)。

もう1つの可能性は、arrが最適化されていることです。これは、gccのコマンドラインに-fdump-tree-optimizedフラグを追加することで確認できます。

あなたはarrが出て最適化されていないことを確認した場合、私はあなたがfollowing warningを取得する必要があります願っています:

prog.cpp:5:25: error: size of variable 'arr' is too large 
    std::array<int, -1> arr; 
+1

このような警告チェック後に最適化が行われませんか? – BartoszKP

+1

@BartoszKP 'gcc --std = C++ 11 -O2 -fdump-tree-optimized arr_que.cpp'を使って、期待通りにコードが' return 0; 'に最適化されていることを確認しました。テンプレートパラメータの誤用を診断する必要があるかどうかはわかりません。 –

19

ありません、それは法的ではありません。これを明示的に防止するstd::arrayの仕様については何もありませんが、コンバージョンを狭めることは違法です。

§14.3.2/ 5:

一体または列挙型の非型テンプレートパラメータについては、変換定数式(5.19)で認め が適用される変換します。

§5.19/ 3:

Aは、タイプTの定数式は、リテラル定数式、 が暗黙的暗黙的な変換は、(もしあれば)に を許可されたTを、型に変換され、変換リテラル定数式と暗黙の変換シーケンス には、ユーザ定義の変換、左辺値 - 右辺値変換(4.1)、 積分プロモーション(4.5)、および整数変換(4.7)のみが含まれます。 変換(8.5.4)

GCCに申し立てを行う唯一の方法は、-Wsign-conversionを有効にすることです。これはknown bugであり、修正する動きはありません。クランで

あなたが予想されるエラーメッセージを取得:あなたが使用しているコンパイラ

error: non-type template argument evaluates to -1, which cannot be 
narrowed to type 'std::size_t' (aka 'unsigned long') [-Wc++11-narrowing] 
    std::array<int, -1> arr; 
+1

ヒストリーノート:公開されたC++ 11では、これは狭い変換であるかどうかは実装定義でしたが、これはDR 1449によって常に狭められるように修正されました –

関連する問題