浅析C++临时变量

在C/C++中,临时变量(也称为临时对象)具有常量性质,是由编译器自动创建的,并在表达式求值期间临时存在。它们主要用于存储中间结果,使表达式的求值过程更加高效和简洁。临时变量的生命周期仅限于表达式的求值过程。所以临时变量不能绑定到非常量引用。当创建一个临时变量并尝试将其绑定到非常量引用时,编译器将会发出错误。

例如,设有如下的一个info类:

class info
{
private:
	int _num;
public:
	info()
	{
		cout << "Non-parametric structure" << endl;
	}
	info(int num) : _num(num)
	{
		cout << "Parametric structure" << endl;
	}
	info(const info& other) : _num(other._num)
	{
		cout << "Copy construction" << endl;
	}
};

那么下面这段代码能否正常运行呢?

info infomation_1 = 8;

答案是可以的。虽然等号左边是一个info类型的,等号右边是一个变量,但是编译器在遇到这种等号左右类型不匹配时会尝试进行“自动类型转换”也就是“隐式转换”,恰好info类中有一个接收int型变量的单参构造,此时这个8就进行隐式转换为了一个info类型的临时变量(或者说是匿名对象),然后就将这个临时变量的值通过拷贝构造拷贝给 infomation_1 这个对象。

那么我们接下来再来看这样一句代码:

info& infomation_2 = 8;

这句代码虽然和上一个差不多,但这句代码就是错误的(运行报错)。这是因为,上面的information_1是一个对象,而这里的infomation_2是一个引用,而且还是非常量引用,由于非常量引用的初始值必须为左值,8经过隐式转换之后的对象是个临时变量,非常量引用不能与临时变量进行绑定,所以这句代码是错误的。

最后,我们再来看下面这句代码:

const info& infomation_2 = 8;

这里的这句代码就可以正常跑通,不会报错。这是因为const修饰的引用可以绑定到不同类型的数据,并且允许接收临时对象(详情见博客:C++初探_小白麋鹿的博客-CSDN博客)

你可能感兴趣的:(小点总结(C\C++),开发语言,c++)