从类型'A'的右值对类型'A&'的非常量引用进行了无效的初始化

时间:2018-07-01 16:20:29

标签: c++ c++11 compiler-errors

#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){        ^

1 个答案:

答案 0 :(得分:0)

因为X的构造函数使用了一个引用,而you can't pass a temporary by reference则是

要解决此问题,请使X构造函数采用const引用。然后,应将funfun2设为const,以便编译代码。