c++ - 更新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);
}
任何分享的知识将不胜感激,如果我实施的解决方案有更好、更快和/或更简单的解决方案,请告诉我!:)
解决方案
这些成员函数被错误地声明和定义
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
推荐阅读
- mysql - 尝试在创建表查询中创建外键约束时出现 SQL 语法错误 1064
- python-3.x - python并行读取csv文件并连接数据框
- python - 解析由冒号分隔的重复键、值(通过正则表达式或其他文本解析过程)
- r - 使用旋转将数据框排序为所需的格式
- c++ - flex-bison c ++中的对象实例
- flutter - 如何从另一个类中清除文本编辑控制器
- laravel - 在 Laravel Vue 中运行 Firebase 推送通知
- asp.net-core - Firefox 插件:同源策略不允许读取远程资源(原因:无法添加 CORS 标头 'Origin')
- symfony - 如何:自定义产品列表页面 Shopware 6
- javascript - 未捕获的 SyntaxError:位置 0 处 JSON 中的意外标记 A - JSON AJAX 请求