错误C2440:'return':无法转换。适用于vs140,141但不适用于vs142

问题描述 投票:1回答:1

我查看了建议,但找不到我的错误。我用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存在问题。但这是其他问题)。

我正在做的可能是非法的,但是当它工作时,它工作正常。而且我不确定,我认为应该没问题。

c++ language-lawyer
1个回答
3
投票

通过不同的编译器(如GCC或Clang)运行此代码时,错误消息更有用:

错误:无法将类型为't1&'的非常量左值引用绑定到类型为't1'的右值

 t2 add() { return t1().append(); }

这告诉你确切的原因:

t2(t1&te):t1(te){}

接受非const引用,它不能是临时对象,例如append()返回 - 但是const引用可以接受临时对象,因此将此构造函数更改为

t2(const t1&te):t1(te){}

修复问题(并且也符合标准)

© www.soinside.com 2019 - 2024. All rights reserved.