我最近一直在做一个项目,我决定将 ReSharper C++ 安装到 Visual Studio。当它分析我的代码时,它吐出了一堆新的警告(显然我有不好的编码习惯..)。我花了一段时间才弄清楚的其中一个是Binding r-value to l-value reference is non-standard Microsoft C++ extension
。我使用以下代码重新创建了警告:
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);
}
据我了解,这在功能上等同于生成警告的代码。我真正想知道的是这里是否有一些我应该注意的事情,因为我很困惑为什么一个函数会抱怨而一个函数不会。
我想我已经弄清楚了。我已经把问题打出来了,所以我将把它和我发现的一起发布,以供其他人参考。我真的没有足够的知识来详细介绍,所以如果不满意,请随时扩展或更正我的答案:)