将r值绑定到l值引用是非标准Microsoft C扩展

我最近一直在做一个项目,我决定将ReSharper C安装到Visual Studio.当它分析我的代码时,它会吐出一堆新的警告(显然我的编码习惯很糟糕……).其中一个花了我一段时间才弄明白的是绑定r值到l值引用是非标准的Microsoft C扩展.我用以下代码重新创建了警告:

Type foo(Type t1, Type t2) {
    return Type(t1.value & t2.value);
}

表达式t1.value& t2.value触发警告.我理解警告的第二部分,这意味着我的代码只是由于Microsoft扩展而编译,而其他编译器会拒绝编译它.我正在使用一个重载运算符,它返回一个对象(称为Datum),其中Type作为构造函数参数,作为引用(Type :: Type(Datum& dat)).

随着一些游戏,我设法通过重构代码使警告消失:

Type bar(Type t1, Type t2) {
    Datum datum = t1.value & t2.value;
    return Type(datum);
}

据我了解,这在功能上等同于生成警告的代码.我真正想知道的是这里是否有一些我应该注意的东西,因为我很困惑为什么一个函数会抱怨而另一个函数却没有.

我想我已经明白了.我已经把问题输出了,所以我要用我发现的内容发布它,以供其他人参考.我没有足够的知识去详细说明,所以如果不满意的话,请随意扩展或更正我的答案:)

解决方法:

这是删除警告的一种方法:变量是左值,因此可以直接绑定到狡猾的构造函数的引用参数,而表达式结果是不能的rvalue.

更好的解决方案是修复构造函数以通过值或常量引用获取其参数:

Type(Datum dat)         // value
Type(Datum const & dat) // constant reference

现在,您可以将参数指定为左值或右值.

上一篇:Real-Time Rendering 笔记


下一篇:Spring-事务管理