C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘mySt

Posted area-h-p

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘mySt相关的知识,希望对你有一定的参考价值。

先看代码(不想看代码可以直接看代码后的问题描述)

//header.h
#ifndef _HEADER_H
#define _HEADER_H
#define defaultSize 128
#include<iostream>
#include<string.h>
using namespace std;
class myString

	private:
		char *ch;
		int curLength;
		int maxSize;
	public:
		myString(int sz=defaultSize);
		myString(const char *init);
		myString(const myString& ob);
		~myString()delete []ch;
		void print();
		int Length()const;
		myString operator()(int pos, int len);
		myString& operator = (myString& ob);
;
myString& myString::operator = (myString& ob)

	if(&ob!=this)
	
		delete[]ch;

		this->ch = new char[ob.maxSize];
		this->maxSize = ob.curLength;
		strcpy(this->ch, ob.ch);
		this->curLength = ob.curLength;
	
	else
	
		cerr<<"String copy error\\n";
	
	return *this;


myString myString::operator()(int pos, int len)

	myString temp;
	if(pos<0 || len<=0 || pos+len-1>=this->maxSize)
	
		temp.curLength = 0;
		temp.ch[0] = ‘\\0‘;
	
	else
	
		if(pos+len-1 >= this->curLength)
			len = this->curLength-pos;
		temp.curLength = len;
		for(int i=0,j=pos; i<len; ++i,++j)
			temp.ch[i] = this->ch[j];
		temp.ch[len] = ‘\\0‘;
	
	return temp;


int myString::Length()const

	return this->curLength;


void myString::print()

	cout<<this->ch<<endl;


myString::myString(int sz)

	this->maxSize = sz;
	this->ch = new char[this->maxSize+1];
	if(this->ch == NULL)
	
		cerr<<"Allocation ERROR\\n";
		exit(1);
	
	this->curLength = 0;
	ch[0] = ‘\\0‘;


myString::myString(const char *init)

	int len = strlen(init);
	this->maxSize = (len > defaultSize) ? len : defaultSize;
	this->ch = new char[this->maxSize+1];
	if(this->ch == NULL)
	
		cerr<<"Application Memory ERROR\\n";
		exit(1);
	

	this->curLength = len;
	strcpy(this->ch, init);



myString::myString(const myString& ob)

	this->maxSize = ob.maxSize;
	this->ch = new char[this->maxSize+1];
	if(this->ch == NULL)
	
		cerr<<"Application Memory ERROR\\n";
		exit(1);
	
	this->curLength = ob.curLength;
	strcpy(this->ch, ob.ch);



#endif

 

//main.cpp
#include"header.h"

int main()

	myString st(10), st1("ABCDEFG");
	myString st2(st1);
	st.print(), st1.print(), st2.print();
	st = st1(0, 4);//???
	st.print();
	return 0;

这是一个字符串类,问题出现在了两个符号重载,()和=

()重载是想对字符串对象做一个切片,返回一个临时对象,=重载就不用说了,就是赋值。

问题就出现在总是无法将这个切片后的临时对象赋值给等号前的对象,编译后如下:

技术图片

 

 

 

在网上一番查找后找到一个类似问题

https://blog.csdn.net/u011068702/article/details/64443949

也就是说,在st1(0,4)时存在了一个临时变量,当把这个临时变量传给st时,由于在=重载函数声明中,参数为myString&,而并不是常量引用。

这个错误是C++编译器的一个关于语义的限制。

如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制

了解这个语义以后就简单了,只需给=重载参数加上const常量限制符

技术图片

(类中=重载函数声明也别忘了要加上const)

加上以后程序的运行结果

技术图片

 

可以,很正确。

总结:

c++中临时变量不能作为非const的引用参数

以上是关于C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘mySt的主要内容,如果未能解决你的问题,请参考以下文章

CTC安装及其错误解决办法:binding.cpp:92:49: error: cannot convert ‘THCudaTensor*’ to ‘const THFloatTensor*’ for

ffprobe: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No

Ubuntu: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No su

Ubuntu: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No su

Ubuntu: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No su

windows: redis bind no error