簡體   English   中英

size_t和sizeof不一致

[英]Inconsistency for size_t and sizeof

如果不包含頭文件,則無法定義本機運算符的結果,這是不是很麻煩?

根據此頁面size_t在頭文件cstddef,cstdio,cstring,ctime和cstdlib中定義。 因此,如果這兩size_t都沒有包含,那么size_t應該是未定義的。 但是,以下程序在沒有任何警告的情況下編譯(使用MSVC 2015RC)。

int main()
{
    auto d_Size = sizeof( int );
    return 0;
}

似乎size_t在本機類型和typedef之間有點混蛋。 標准說什么?

5.3.3 Sizeof [expr.sizeof]

1)sizeof運算符產生其操作數的對象表示中的字節數。 操作數是表達式,它是未評估的操作數(第5條)或帶括號的type-id。 sizeof運算符不應該應用於具有函數或不完整類型的表達式,此類型的帶括號的名稱,或者應用於指定位字段的glvalue。 sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1.應用於任何其他基本類型(3.9.1)的sizeof的結果是實現定義的。 [注意:特別是,sizeof(bool),sizeof(char16_t),sizeof(char32_t)和sizeof(wchar_t)是實現定義的.75 - 結束注釋] [注意:有關字節的定義,請參閱1.7,有關對象表示的定義。 - 結束說明]

6) sizeof和sizeof ...的結果是std :: size_t類型的常量 [注意:std :: size_t在標准頭文件<cstddef> (18.2)中定義。 - 結束說明]

但是, std::size_t只是一個類型別名。 sizeof運算符可以返回其結果,而無需“訪問”類型別名; sizeof的結果是一些基本類型(實現定義),然后在<cstddef>其別名為std::size_t

還要注意,在C ++中, typedef或者using 不要定義新類型 (即強類型 ),而只是別名(即它們的typeid是相同的)。 因此,在您的情況下, auto只是推導出sizeof運算符返回的基本類型,它與類型別名std::size_t 編譯器沒問題。

根據C ++標准, std::size_t<cstddef>定義。

5.3.3尺寸

...

6 sizeofsizeof...的結果是std::size_t.類型的常量std::size_t. [ 注意: std::size_t在標准頭文件<cstddef> (18.2)中定義。 - 結束說明 ]

暫無
暫無

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

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