我已經在這個偶然的typedef:這個typedef是什麼意思,它有什麼好處?
typedef char (&small)[1];
typedef char (&large)[2];
我知道&
無論是作爲參考預選賽或地址的運營商。既然我們在這裏處理類型,我猜這是一個參考,但是括號是否有特殊用途?
在上下文中,我從它得到它是用來執行編譯時檢查類型的可轉換性,這個typedef怎麼可以在這個問題上有所幫助?
我已經在這個偶然的typedef:這個typedef是什麼意思,它有什麼好處?
typedef char (&small)[1];
typedef char (&large)[2];
我知道&
無論是作爲參考預選賽或地址的運營商。既然我們在這裏處理類型,我猜這是一個參考,但是括號是否有特殊用途?
在上下文中,我從它得到它是用來執行編譯時檢查類型的可轉換性,這個typedef怎麼可以在這個問題上有所幫助?
的typedef
小號限定到的char
數組的引用:small
是一個char
和large
的陣列作爲兩種char
陣列。這種類型的typedef
的目的是使它們從基於重載的屬性檢查器返回:如果屬性存在,則返回一個,否則返回另一個。然後將結果用於sizeof()
確定的財產,例如:
template <typename B, typename S>
struct is_base_of_helper {
static small test(B*);
static large test(void*, ...);
};
template <typename B, typename S>
struct is_base_of {
enum value { 1 == sizeof(is_base_of_helper<B, S>::test(static_cast<S*>(0)) };
};
測試可能語義不是很準確,但這個想法是:調用一個sizeof()
操作的重載函數和測試結果的大小。取決於選擇哪個過載,可以確定類型屬性的存在。使用對數組的引用具有很好的屬性,它們的大小可以被預測(分別爲small
和large
,分別爲1和2)。使用例如內置類型的大小不能可靠地工作,因爲它們都可以具有相同的大小。
...是的,括號內的問題:如果沒有括號,那麼創建引用數組而不是引用數組是非法的嘗試。只有後者給出了尺寸保證。
那麼'char'在這裏被任意選中?如果我正確理解了你,選擇這個數組是因爲不能保證sizeof(T1)!= sizeof(T2)否則。但是int(&small)[1]'也可以起作用? –
@ mel-爲什麼不呢?另外,爲什麼需要parens:'&'在聲明中的優先級低於'[]',所以'char&small [1]'被解析爲'char&(arr [1])',AFAIK是非法的,你不能聲明一個引用數組。 – 2013-07-22 22:54:24
它會使用'int(&small)[1]'。然而,一個char類型的數組的大小爲1:sizeof(char)被定義爲1,而類型的大小是數組中兩個相鄰對象的數量是分開的。也就是說,如果已經使用了'int',測試將需要使用'sizeof(int)'而不是1。 –
這些陳述typedef
分別引用大小爲1和大小爲2的數組。這是一個例子:
/*
foo accepts arrays of size 10 only!
*/
void foo(int (&array)[10])
{ ... }
另一個例子:
/*
foo accepts arrays of size len!
The size is len, so you can know the size of the array
unlike when using a pointer to int.
(unless you pass the size in the next parameter, of course!)
*/
template <std::size_t len>
void foo(int (&array)[len])
{ ... }
small是對大小爲1的char數組的引用,large是對大小爲2的char數組的引用。 – Rapptz
由於'[]'在'&'(在聲明符中)之前綁定:w/* parantheses,'char&small [1]'將是一個* char *數組的引用,這是非法的(引用數組是不允許的)。 – dyp