我了解具有左值的引用类型,它应该有地址。
但是,我不明白为什么它会起作用。
我认为
{1}
是r值,但它工作正常..
void func(const vector<int>& v)
{
;
}
int main()
{
func({ 1 });
return 0;
}
{ 1 }
根本不是一个表达式。它没有任何值类别或类型。
函数参数中的大括号
{ /*...* }
仅表示该参数应像变量定义中的= { /*...*/ }
一样进行初始化。
所以这意味着参数的初始化将完全按照您所写的那样进行
const vector<int>& v = { 1 };
这是可行的,因为
const
左值引用的初始化规则允许创建一个可以绑定引用的临时对象。
所以这(几乎)相当于
const vector<int> unnamed = { 1 };
const vector<int>& v = unnamed;
其中
unnamed
是一个没有名称的临时对象,其生命周期延长到发生函数调用的完整表达式的末尾。
它之所以有效,是因为常量引用可以绑定到临时(右值)。