Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初始化类型为‘;的非常量引用无效;标准::向量<;双倍>&’;来自类型的右值 我正在学习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; } intmain(){ 向量a1; a1.推回(3); a1.推回(7); a1.推回(2); vector&a2=a1;//注释1:此行没有错误 vector&a4=print(a2);//注释2:为什么此行有错误?R值是一个对象,那么它应该被a4引用? 返回0; } 矢量打印(矢量和a3){ cout_C++ - Fatal编程技术网

初始化类型为‘;的非常量引用无效;标准::向量<;双倍>&’;来自类型的右值 我正在学习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; } intmain(){ 向量a1; a1.推回(3); a1.推回(7); a1.推回(2); vector&a2=a1;//注释1:此行没有错误 vector&a4=print(a2);//注释2:为什么此行有错误?R值是一个对象,那么它应该被a4引用? 返回0; } 矢量打印(矢量和a3){ cout

初始化类型为‘;的非常量引用无效;标准::向量<;双倍>&’;来自类型的右值 我正在学习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; } intmain(){ 向量a1; a1.推回(3); a1.推回(7); a1.推回(2); vector&a2=a1;//注释1:此行没有错误 vector&a4=print(a2);//注释2:为什么此行有错误?R值是一个对象,那么它应该被a4引用? 返回0; } 矢量打印(矢量和a3){ cout,c++,C++,您的print返回类型不是引用,因此,您返回a3的副本。它是临时的,您无法将其绑定到引用 您可以通过以下方法解决此问题: vector<double>& print(vector<double>& a3){ // ^ // note the ampersand here 矢量和打印(矢量和a3){ // ^ //注意这里的符号和 Blehh,所以…是的,返回值是一个临时值。因此,保留对它的引用是没有意义的(想象

您的
print
返回类型不是引用,因此,您返回
a3
的副本。它是临时的,您无法将其绑定到引用

您可以通过以下方法解决此问题:

vector<double>& print(vector<double>& a3){
//            ^
// note the ampersand here
矢量和打印(矢量和a3){
//            ^
//注意这里的符号和

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

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

I.保持对它的常量引用,如

const vector<double> &retVal = print();
const vector&retVal=print();
常量引用将绑定临时对象的生存期延长到引用的生存期

二、 只需按值返回:

vector<double> retVal = print();
vector retVal=print();
三、 返回对对象的引用,您知道该对象将有足够的生存期,例如类成员:

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

Foo f;
vector<double> &retVal = f.print();
class-Foo{
向量向量机;
公众:
向量和打印(){
返回向量;
}
};
福福;
向量&retVal=f.print();
不要,但是,从函数返回对临时的引用,如下所示:

// this is wrong:
vector<double> &print()
{
    vector<double> v;
    return v;
}
//这是错误的:
向量和打印()
{
向量v;
返回v;
}

因为它调用了未定义的行为。(请注意,这与您的示例不同,因为您返回的函数参数当然是活动的,但值得注意的是,在这种情况下,这是一个常见的错误。)

您不能将非常量引用绑定到临时引用。a3如何是临时引用?它是如何声明的?我知道我的概念是松散的。请澄清。@Bhaskar它是临时引用,只是因为它是函数的返回值。(除了确切的术语,从概念上讲,它真的很琐碎。)这是一个很好的未定义行为。@H2CO3,嗯。为什么?
a3
也是一个引用。啊,对不起,没有注意到它是函数参数本身。