是否是一个临时的l值
is a temporary l-value or not?
为什么main中的第一行可以编译,而第二行不能?我认为两者都是临时的,但一个被视为l值,另一个不是。
class complex
{
public:
complex() : r(0),i(0) {}
complex(double r_, double i_) : r(r_), i(i_)
{
}
private:
double r;
double i;
};
int main()
{
complex(2,2) = complex(1,2);
char() = char(2);
}
对于类类型,赋值操作符是成员函数。也就是说,a = b
只是a.operator=(b)
的合成糖。在临时对象上调用成员函数是完全可以的。
请注意,在c++中,术语左值与赋值的左边没有任何关系。正如您的示例所演示的,给类类型的右值赋值是完全可以的。此外,有些左值不能赋值,例如数组和/或常量,尤其是字符串字面值。
如果你没有创建赋值操作符,编译器会为你创建一个。这意味着您创建了两个临时对象,并将一个分配给另一个,然后它们都将被丢弃。
不,第二个不是临时的。临时对象是具有(通常是有限的)生命周期的东西,并且在其生命周期内有一个存储区域。
A char()
没有这些。因此,禁止赋值这样的表达式。从语言的角度来看,不清楚赋值改变了什么。之后2
是否等于0
?
相关文章:
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 如何检查一个模板是否是另一个模板的类成员
- 如何检查字符串中的最后一个字符是否是某个字符并将其从字符串中删除?(C++)
- 如何以更有效的方式检查一个数字是否是素数?
- 检查数值类型是否是另一个数值类型的子集
- 在另一个对象 B 中创建对象 A 时,对象 A 是否是对象 B 的本地对象,对象 A 是否会存在于对象 B 的实例化之外?
- 编写一个函数,用递归函数检查数字是否是正方形
- 如何判断变量是否是一个复杂的数字C
- 我试图编写一个代码来查找一个单词是否是回文,但它不起作用。怎么了?
- 找出std :: type_info对象是否是C 中另一个std :: type_info对象的子类型
- 如何在不使用数学的情况下知道一个数字是否是回文
- 确定一个方法是否是纯虚拟的(c++)
- 检查字符串向量是否是其中一个元素中的子字符串
- 是正则是查看字符串是否是另一个弦的好方法
- 检查一个字符串是否是另一个字符串的排列C++
- 检查当前元素是否是集合的最后一个元素
- 如何检查字符串是否是另一个字符串的正确子集
- 如何使用 for(int i:myVector) 代码样式知道元素是否是矢量中的最后一个元素
- 如何检查一个范围内的值是否是另一个范围内的值的倍数
- Strchr不起作用,或者我需要一个替代方案来检查给定字符串中的任何字符是否是另一个字符串的一部分