非const引用的初始化无效

时间:2012-10-01 19:20:18

标签: c++ initialization most-vexing-parse

好吧,我试图弄清楚这个错误,到目前为止,绝对没有运气。我这样做是为了完成家庭作业,这就是为什么我没有使用附带的课程。

以下是相关代码:

//Will return an array where each element is the sum of the respective sums in the added         arrays
Vec& Vec::operator+(Vec& v2) const{
    Vec ret();
    if(mySize>0){
        Vec ret(mySize);
        for(unsigned i = 0;i<mySize;i++){
            ret[i]=v2[i]+myArray[i];
        }
    }
    else{
    }
    return ret;
}

从.h文件......:

Vec& operator+ (Vec& v2) const;

这会抛出错误:&#34;从'Vec(*)()'&#34;类型的右值开始,无效初始化'Vec&amp;'类型的非const引用; 我对C ++完全陌生,所以任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:7)

Vec ret();

被认为是函数的前向声明,它不带参数并返回Vec。请参阅:the most vexing parse.

接下来,您将返回对局部变量的引用,这是不好的。一旦函数返回,ret就会超出范围。

答案 1 :(得分:3)

实际错误是您在运算符内声明了一个函数,而不是声明一个Vec对象。

Vec ret();

您可以通过省略()

来解决这个问题
Vec ret;

除此之外,您还有一个基本的设计错误,即您尝试返回对运算符范围内的变量的引用,从而产生悬空引用。表达加法运算符的常用方法是让它返回一个新对象,并且通常实现为具有签名的非成员函数,例如

Vec operator+(const Vec& lhs, const Vec& rhs);

这可以通过增量成员运算符

来实现
Vec& operator+=(const Vec& rhs);

这个可以返回对this的引用,因此没有悬空引用。然后,operator+的示例实现将是

Vec operator+(Vec lhs, const Vec& rhs)
{
    return lhs += rhs;
}

答案 2 :(得分:0)

正如其他人所说的那样,您认为ret的初始声明是默认构造Vec实际上正在转发一个不带参数并返回Vec的函数。 AKA most vexing parse

if语句中的'{3}}'ret'也意味着你没有修改你期望返回的变量。你可能想要更像这样的东西:

Vec Vec::operator+(const Vec& v2) const{
    Vec ret(mySize);
    if(mySize>0){
        for(unsigned i = 0;i<mySize;i++){
            ret[i]=v2[i]+myArray[i];
        }
    }
    else{
    }
    return ret;
}