【问题标题】:invalid initialization of non-const reference of type 'A&' from an rvalue of type 'A' [duplicate]从“A”类型的右值初始化“A&”类型的非常量引用无效[重复]
【发布时间】: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++ 就是这样工作的。

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢@iMajuscule :)
  • @ChetanKole 不客气!如果解决了问题,请将答案标记为已接受:)
  • 为什么投反对票?
猜你喜欢
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2021-10-26
  • 2017-09-08
  • 2015-01-26
相关资源
最近更新 更多