带有大括号初始化的向量引用参数。为什么它有效?

问题描述 投票:0回答:2

我了解具有左值的引用类型,它应该有地址。

但是,我不明白为什么它会起作用。

我认为

{1}
是r值,但它工作正常..

void func(const vector<int>& v)
{
    ;
}

int main()
{
    func({ 1 });

    return 0;
}
c++ parameters reference
2个回答
0
投票

{ 1 }
根本不是一个表达式。它没有任何值类别或类型。

函数参数中的

大括号

{ /*...* }
仅表示该参数应像变量定义中的
= { /*...*/ }
一样进行初始化。

所以这意味着参数的初始化将完全按照您所写的那样进行

const vector<int>& v = { 1 };

这是可行的,因为

const
左值引用的初始化规则允许创建一个可以绑定引用的临时对象。

所以这(几乎)相当于

const vector<int> unnamed = { 1 };
const vector<int>& v = unnamed;

其中

unnamed
是一个没有名称的临时对象,其生命周期延长到发生函数调用的完整表达式的末尾。


0
投票

它之所以有效,是因为常量引用可以绑定到临时(右值)。

© www.soinside.com 2019 - 2024. All rights reserved.