我查看了建议,但找不到我的错误。我用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)运行此代码时,错误消息更有用:
错误:无法将类型为't1&'的非常量左值引用绑定到类型为't1'的右值
t2 add() { return t1().append(); }
这告诉你确切的原因:
t2(t1&te):t1(te){}
接受非const
引用,它不能是临时对象,例如append()
返回 - 但是const
引用可以接受临时对象,因此将此构造函数更改为
t2(const t1&te):t1(te){}
修复问题(并且也符合标准)