左值具備對象或不完整類型,在C++中還具備函數或引用類型,可是,並不是具備上述類型的表達式就是左值,關鍵是左值必須指示一個對象,不管該對象有效或無效、完整或不完整,在C++中則包含非靜態成員函數以外的函數。例如:函數
int i;對象
int *p = &i;引用
i和p都指示一個對象,且具備對象類型,於是都是左值,而&i雖然具備對象類型,但因爲沒有指示一個對象,所以不是左值。struct
不完整類型也能夠成爲左值,由於不完整類型本質其實與對象類型同樣,只不過還沒有有完整的對象信息。前向聲明是咱們最經常使用的不完整類型,對前向聲明的引用是容許的,例如:
extern struct S s;
S & r = s;
雖然s的完整定義還沒有可見,但仍能夠做爲左值初始化左值引用。