从“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& r = 42;
你明白为什么不能编译吗?你明白为什么你正在做的事情和这个是一样的吗?
我明白了你的意思,但请你帮我理解为什么传递给 X 的 B() 应该是 const ?
因为 C++ 就是这样工作的。
【参考方案1】:
因为X
的构造函数需要一个引用,而you can't pass a temporary by reference。
要修复它,让 X 构造函数获取一个 const 引用。然后,fun
和 fun2
应设为 const 以编译代码。
【讨论】:
谢谢@iMajuscule :) @ChetanKole 不客气!如果解决了问题,请将答案标记为已接受:) 为什么投反对票?以上是关于从“A”类型的右值初始化“A&”类型的非常量引用无效[重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C++ 不能用“超类”类型的右值初始化“派生类”类型的变量?
为什么`std :: pair`允许使用用户定义的删除移动构造函数从类类型的右值初始化?
无法使用“const Node *”类型的右值初始化“Node *”类型的变量
无法使用“value_type *”类型的右值(又名 char*)初始化“const unsigned char *”类型的参数