[英]How does “sizeof” work in this helper for determining array size?
我發現這篇文章提出了以下模板和一個用於獲取數組大小的宏:
template<typename Type, size_t Size>
char ( &ArraySizeHelper(Type( &Array )[Size]) )[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))
我發現以下部分完全不清楚。 sizeof
應用於 function 聲明。 我希望結果是“function 指針的大小”。 為什么它會獲得“返回值的大小”呢?
sizeof
應用於 function調用的結果,而不是聲明。 因此,它給出了返回值的大小,在這種情況下,它是對字符數組的引用。
該模板使返回類型中的數組具有與參數數組相同數量的元素,參數數組從宏饋送到 function。
最后,將sizeof
應用於對該 char 數組的引用。 引用上的sizeof
與類型本身的sizeof
相同。 由於sizeof(char) == 1
,這給出了數組中元素的數量。
template<typename Type, size_t Size>
char (&ArraySizeHelper(Type(&Array)[Size]))[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))
sizeof
應用於 function 聲明。 我希望結果是“function 指針的大小”。 為什么它會獲得“返回值的大小”呢?
它不是sizeof ArraySizeHelper
(這將是非法的 - 不能采用sizeof
函數),也不是sizeof &ArraySizeHelper
- 甚至不是隱式的,因為標准明確禁止從 function 到指向函數的隱式轉換,對於 C++0x,請參見5.3.3)。 相反,它的sizeof ArraySizeHelper(Array)
相當於sizeof
function 調用返回的值,即sizeof char[Size]
因此Size
。
ArraySizeHelper
是一個 function 模板,它返回一個大小為Size
的char
數組。 該模板有兩個參數,一個是類型(即Type
),另一個是值(即Size
)。
因此,當您將類型為A[100]
的 object 傳遞給 function 時。 編譯器推導出模板的 arguments : Type
變為A
, Size
變為100
。
所以實例化的 function 返回類型變為char[100]
。 由於sizeof
的參數從未被評估,因此 function 不需要定義。 sizeof
只需要知道 function 的返回類型是char[100]
。 這等效於sizeof(char[100])
返回 100 - 數組的大小。
另一個需要注意的有趣點是sizeof(char)
不依賴於編譯器,這與其他原始類型不同(除了char 1的變體)。 它總是1
。 所以sizeof(char[100])
保證為100
。
1. 根據標准, char
的所有變體的大小都是 ONE,無論是char
、 signed char
、 unsigned char
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.