我查看了所有建议,但找不到与我的错误类似的内容。我用 vs141 遇到了这个问题并修复了它,我相信通过更改 VS 中的 c++ ISO Standard
。可能是我装VS2019的时候卸载VS2017太仓促了,回头看看干了什么。它只适用于我仍然安装的 vs140。此代码将产生 vs142 错误:
struct t1{
t1 append() { return t1(); }
};
struct t2 : public t1{
t2(t1&te):t1(te){}
t2 add() { return t1().append(); } //error C2440
};
在我的例子中,t1 来自另一个库,我用 t2 包装它。我在 VS2019 中尝试了 c++ ISO Standard
的所有变体,但错误仍然存在。
更令我困惑的是,我编译了另一个使用与 VS2019 相同代码的项目,没有错误! This Code, line 36 . (注意,现在 boost::fusion 和 boost::spirit::x3 有问题。但那是另外一回事)。
我正在做的事情可能是非法的,但当它起作用时,它会很好地工作。由于我不确定,我认为应该没问题。
最佳答案
当通过不同的编译器(例如 GCC 或 Clang)运行此代码时,错误消息会更有帮助:
error: cannot bind non-const lvalue reference of type 't1&' to an rvalue of type 't1'
t2 add() { return t1().append(); }
这会告诉您确切的原因:
t2(t1&te):t1(te){}
接受一个非 const
引用,它不能是一个临时对象,例如 append()
返回的 - 但是一个 const
引用可以接受临时对象,因此将此构造函数更改为
t2(const t1&te):t1(te){}
解决了问题(并且也符合标准)
关于c++ - 错误 C2440 : 'return' : cannot convert. 适用于 vs140,141 但不适用于 vs142,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55751442/