簡體   English   中英

負數數組沒有錯誤

[英]No error for negative-size array

為什么在創建負大小的數組時沒有出現錯誤?

#include <array>

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

使用-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC我沒有任何錯誤。 這是預期的行為嗎?

不,這是不合法的。 關於std::array的規范並沒有明確地阻止這種情況的發生,但是由於轉換范圍狹窄,它是非法的。

§14.3.2/ 5:

對於整數或枚舉類型的非類型模板參數,將應用轉換后的常量表達式(5.19)中允許的轉換。

§5.19/ 3:

類型T的轉換常量表達式是文字常量表達式,它隱式轉換為類型T,其中文字常量表達式中允許隱式轉換(如果有),並且隱式轉換序列僅包含用戶定義的轉換,即左值到右值轉化(4.1),積分促銷(4.5)和積分轉化(4.7),而不是縮小轉化(8.5.4)

使GCC抱怨的唯一方法是啟用-Wsign-conversion 這是一個已知的錯誤 ,他們尚未采取任何行動來修復它。

在Clang中,您會收到預期的錯誤消息:

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;

std::array類型是:

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

當您使用-1初始化第二個模板參數時,它會隱式轉換為一個非常大的值,因為std::size_tunsigned (在C ++中,由其他答案指出這是非法的,應該對其進行診斷)。

另一種可能性是您的arr已優化。 您可以通過在gcc命令行中添加-fdump-tree-optimized標志來確認這一點。

如果您確保arr沒有被優化,希望您收到以下警告

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM