从“A”类型的右值初始化“A&”类型的非常量引用无效[重复]

Posted

技术标签:

【中文标题】从“A”类型的右值初始化“A&”类型的非常量引用无效[重复]【英文标题】:invalid initialization of non-const reference of type 'A&' from an rvalue of type 'A' [duplicate] 【发布时间】:2018-07-01 16:20:29 【问题描述】:
#include<iostream>

class A 

    public:
        void fun()  fun2(); 
        ~A() = default;
    protected:
        virtual void fun2() = 0 ;
;

class B : public A 
    protected:
        virtual void fun2()  std::cout<<"Hiiii"; 
;

class X 
    public:
        X(A& a) 
           a.fun();
          
;

class Y 

    public:
        Y( int x ) : val(x), x(B())
        
    private:
        int val;
        X x;
 ;


 int main() 

    Y y(5);
 

我无法弄清楚为什么会出现以下编译错误:

prog.cpp:在构造函数“Y::Y(int)”中: prog.cpp:30:32:错误:从“A”类型的右值对“A&”类型的非常量引用进行无效初始化 Y(int x):val(x),x(B()) ^ prog.cpp:21:7:注意:初始化 'X::X(A&)' 的参数 1 X(A&a) ^

【问题讨论】:

这是一个较短的复制:int&amp; r = 42; 你明白为什么不能编译吗?你明白为什么你正在做的事情和这个是一样的吗? 我明白了你的意思,但请你帮我理解为什么传递给 X 的 B() 应该是 const ? 因为 C++ 就是这样工作的。 【参考方案1】:

因为X的构造函数需要一个引用,而you can't pass a temporary by reference。

要修复它,让 X 构造函数获取一个 const 引用。然后,funfun2 应设为 const 以编译代码。

【讨论】:

谢谢@iMajuscule :) @ChetanKole 不客气!如果解决了问题,请将答案标记为已接受:) 为什么投反对票?

以上是关于从“A”类型的右值初始化“A&”类型的非常量引用无效[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 不能用“超类”类型的右值初始化“派生类”类型的变量?

为什么`std :: pair`允许使用用户定义的删除移动构造函数从类类型的右值初始化?

无法使用“const Node *”类型的右值初始化“Node *”类型的变量

从4行代码看右值引用

无法使用“value_type *”类型的右值(又名 char*)初始化“const unsigned char *”类型的参数

为啥定义复制构造函数会给我错误:不能将'obj&'类型的非常量左值引用绑定到'obj'类型的右值?