gpt4 book ai didi

c++ - 从类型的右值初始化类型为 ‘std::vector&’ 的非常量引用无效

转载 作者:太空狗 更新时间:2023-10-29 19:46:05 27 4
gpt4 key购买 nike

我正在学习 C++ 并尝试一些东西。编译器不会在注释 2 行抛出错误。

int main(){
vector<double> a1;
a1.push_back(3);
a1.push_back(7);
a1.push_back(2);
vector<double>& a2 = a1; //COMMENT 1: This line has no error
vector<double>& a4 = print(a2); //COMMENT 2: Why this line has error? R value is an object then it should be referenced by a4?
return 0;
}

vector<double> print(vector<double>& a3){
cout<<"In print function the size of vector is :";
cout<<a3.size()<<endl;
return a3;
}

最佳答案

Blehh,所以...是的,返回值是临时的。因此,保留对它的引用是没有意义的(想象一下:当临时对象被销毁时,引用什么都不引用)。因此,这是不允许的。

您可以通过多种方式解决此问题:

我。保持对它的 const 引用,如

const vector<double> &retVal = print();

const 引用将绑定(bind)的临时对象的生命周期延长到引用的生命周期。

二。只需按值返回它:

vector<double> retVal = print();

三。返回对您知道将有足够生命周期的对象的引用,例如。 G。类(class)成员:

class Foo {
vector<double> vec;
public:
vector<double> &print() {
return vec;
}
};

Foo f;
vector<double> &retVal = f.print();

不要,但是,像这样从函数返回对临时对象的引用:

// this is wrong:
vector<double> &print()
{
vector<double> v;
return v;
}

因为它调用未定义的行为。(请注意,这与您的示例不同,因为您返回的函数参数当然是事件的,但值得注意这种情况,因为它很常见犯错误。)

关于c++ - 从类型的右值初始化类型为 ‘std::vector<double>&’ 的非常量引用无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17905101/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com