ネガティブサイズの配列を作成しようとするとエラーが発生します。ネガティブサイズの配列にエラーがありません
#include <array>
int main()
{
std::array<int, -1> arr;
}
-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
とエラーは発生しません。これは意図された動作ですか? std::array
の
ネガティブサイズの配列を作成しようとするとエラーが発生します。ネガティブサイズの配列にエラーがありません
#include <array>
int main()
{
std::array<int, -1> arr;
}
-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
とエラーは発生しません。これは意図された動作ですか? std::array
の
タイプがある:あなたが-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;
このような警告チェック後に最適化が行われませんか? – BartoszKP
@BartoszKP 'gcc --std = C++ 11 -O2 -fdump-tree-optimized arr_que.cpp'を使って、期待通りにコードが' return 0; 'に最適化されていることを確認しました。テンプレートパラメータの誤用を診断する必要があるかどうかはわかりません。 –
ありません、それは法的ではありません。これを明示的に防止する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;
ヒストリーノート:公開されたC++ 11では、これは狭い変換であるかどうかは実装定義でしたが、これはDR 1449によって常に狭められるように修正されました –
を? gcc 5.3.1を使用しました。エラー '変数のサイズ' arr 'が大きすぎます。 –