首页 > 解决方案 > 更新VS2013到VS2019导致Lvalue错误,想了解一下原因

问题描述

编辑:这不是一个重复的问题。人们将我的问题混淆为“为什么我的代码不起作用”,但事实并非如此,它的“为什么它在 VS 2013 而不是 2019 上起作用”并且已经得到解答。这不是一个重复的问题。我多次询问为什么它在 2013 年而不是 2019 年有效。

所以我正在创建一个 DLL,并决定从 VS2013 升级到 VS2019,这样我就可以获得最新的 Visual Studio 包和最新的 IDE。升级后突然出现一个错误: initial value of reference to non-const must be an lvalue 自从这个错误我终于设法修复它,但我想了解为什么会发生这个错误,特别是在升级到不同版本的 Visual Studio 之后。

简而言之,在 Visual Studio 2013 中运行的代码是一个具有成员函数和运算符重载的向量结构,如下所示:

标题

struct Vec2 {
    float x, y;
    /* Insert other obligatory code */
    Vec2 add(const Vec2);
    Vec2 &operator+(const Vec2);
}

执行

Vec2 Vec2::add(const Vec2 o) {
    return {
        x + o.x,
        y + o.y
    };
}
Vec2 &Vec2::operator+(const Vec2 o) {
    return add(o); // <-- 'initial value of reference to non-const must be an lvalue'
}

就像我之前说的,这段代码可以完美地运行和编译。在我升级后,当它到达return add(o);我重载的 plus 运算符函数时,它抛出了前面提到的错误。

我只是想知道为什么在我升级后开始发生这种情况...... MSVC 编译器有什么变化吗?

我确实修复了它,这是我的解决方案,但我担心它可能效率低下......

新标题

struct Vec2 {
    /* yada yada */
    Vec2 &add(const Vec2);
    Vec2 &operator+(const Vec2);
}

新的实现

Vec2 &Vec2::add(const Vec2 o) {
    Vec2 v(x + o.x, y + o.y); // Just normal constructor
    return v;
}
Vec2 &Vec2::operator+(const Vec2 o) {
    return add(o); 
}

任何分享的知识将不胜感激,如果我实施的解决方案有更好、更快和/或更简单的解决方案,请告诉我!:)

标签: c++classoopstructoperator-overloading

解决方案


这些成员函数被错误地声明和定义

Vec2 add(const Vec2);
Vec2 &operator+(const Vec2);

例如,在第一个函数const中,参数声明中的限定符是多余的。函数应该使用限定符 const 声明,因为它们不会更改原始向量。

在第二个函数中,您将返回对临时对象的引用。

可以通过以下方式声明和定义函数

struct Vec2 {
    float x, y;
    /* Insert other obligatory code */
    Vec2 add(const Vec2 &) const;
    Vec2 operator+(const Vec2 & ) const;
};

Vec2 Vec2::add(const Vec2 &o) const {
    return {
        x + o.x,
        y + o.y
    };
}

Vec2 Vec2::operator+(const Vec2 &o) const {
    return add(o); 
}

这是一个演示程序

#include <iostream>

struct Vec2 {
    float x, y;
    /* Insert other obligatory code */
    Vec2 add(const Vec2 &) const;
    Vec2 operator+(const Vec2 & ) const;
};

Vec2 Vec2::add(const Vec2 &o) const {
    return {
        x + o.x,
        y + o.y
    };
}

Vec2 Vec2::operator+(const Vec2 &o) const {
    return add(o); 
}

int main() 
{
    Vec2 v1 = { 10, 10 };
    Vec2 v2 = { 20, 20 };

    Vec2 v3 = v1 + v2;

    std::cout << v3.x << ' ' << v3.y << '\n';

    v3 = v3.add( v3 );

    std::cout << v3.x << ' ' << v3.y << '\n';

    return 0;
}

它的输出是

30 30
60 60

推荐阅读