2013-07-22 61 views
3

我已經在這個偶然的typedef:這個typedef是什麼意思,它有什麼好處?

typedef char (&small)[1]; 
typedef char (&large)[2]; 

我知道&無論是作爲參考預選賽或地址的運營商。既然我們在這裏處理類型,我猜這是一個參考,但是括號是否有特殊用途?

在上下文中,我從它得到它是用來執行編譯時檢查類型的可轉換性,這個typedef怎麼可以在這個問題上有所幫助?

+1

small是對大小爲1的char數組的引用,large是對大小爲2的char數組的引用。 – Rapptz

+1

由於'[]'在'&'(在聲明符中)之前綁定:w/* parantheses,'char&small [1]'將是一個* char *數組的引用,這是非法的(引用數組是不允許的)。 – dyp

回答

6

typedef小號限定到的char數組的引用:small是一個charlarge的陣列作爲兩種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()操作的重載函數和測試結果的大小。取決於選擇哪個過載,可以確定類型屬性的存在。使用對數組的引用具有很好的屬性,它們的大小可以被預測(分別爲smalllarge,分別爲1和2)。使用例如內置類型的大小不能可靠地工作,因爲它們都可以具有相同的大小。

...是的,括號內的問題:如果沒有括號,那麼創建引用數組而不是引用數組是非法的嘗試。只有後者給出了尺寸保證。

+0

那麼'char'在這裏被任意選中?如果我正確理解了你,選擇這個數組是因爲不能保證sizeof(T1)!= sizeof(T2)否則。但是int(&small)[1]'也可以起作用? –

+0

@ mel-爲什麼不呢?另外,爲什麼需要parens:'&'在聲明中的優先級低於'[]',所以'char&small [1]'被解析爲'char&(arr [1])',AFAIK是非法的,你不能聲明一個引用數組。 – 2013-07-22 22:54:24

+0

它會使用'int(&small)[1]'。然而,一個char類型的數組的大小爲1:sizeof(char)被定義爲1,而類型的大小是數組中兩個相鄰對象的數量是分開的。也就是說,如果已經使用了'int',測試將需要使用'sizeof(int)'而不是1。 –

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]) 
{ ... }