c++ - 错误 C2440 : 'return' : cannot convert. 适用于 vs140,141 但不适用于 vs142

标签 c++ language-lawyer

我查看了所有建议,但找不到与我的错误类似的内容。我用 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/

相关文章:

c++ - boost::multiprecision::mpz_int 的构造函数继承失败

c - 声明与定义的联系依据

c++ - C++ 中指针运算的 a+i 和 &a[i] 有什么区别?

c++ - 耳朵识别和上半身 haarcascade

c++ - Fedora 22 - 编译 - __atomic_is_lock_free

c++ - C/C++ Windows 或 Linux 将随机内存块映射为连续顺序

c++ - 空参数包扩展不同于手动空参数包

c++ - 已调用 WM_TIMER 消息但未设置计时器

c++ - 将结构复制到 vector

c++ - 非依赖名称的重载解析何时发生,在定义上下文或实例化点?