![](/img/trans.png)
[英]wxWidgets cross-compile - error: size of array ‘_GStaticAssertCompileTimeAssertion_0’ is negative
[英]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_t
是unsigned
(在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.