左值具有对象或不完整类型,在C++中还具有函数或引用类型,但是,并非具有上述类型的表达式就是左值,关键是左值必须指示一个对象,无论该对象有效或无效、完整或不完整,在C++中则包含非静态成员函数之外的函数。例如:
int i;
int *p = &i;
i和p都指示一个对象,且具有对象类型,因而都是左值,而&i虽然具有对象类型,但由于没有指示一个对象,因此不是左值。
不完整类型也可以成为左值,因为不完整类型本质其实与对象类型一样,只不过尚未有完整的对象信息。前向声明是我们最常用的不完整类型,对前向声明的引用是允许的,例如:
extern struct S s;
S & r = s;
虽然s的完整定义尚未可见,但仍可以作为左值初始化左值引用。