2016-11-20 116 views
-1
  1. C++中的赋值运算符(例如x = 5)会返回一个值,并将该值复制到变量中。赋值运算符返回的值(也就是结果是什么)是什么?
+4

嗯不是你的问题包含答案?赋值运算符返回赋值(对于内置类型,对于用户定义的类型,它返回用户定义的...) – Hcorg

回答

0

根据C++标准(5.18分配和复合赋值操作符)

1所述的赋值运算符(=)和化合物赋值运算符 所有组从右到左。都需要一个MODI音响能够左值作为它们的左 操作数和返回左值指的是左操作数

2在简单赋值(=),则表达式的值替换 左操作数引用的对象。

因此,如果您在下面的代码片段

int x; 
x = 5; 

则x得到值5和赋值表达式返回x的lvalue。这使得赋值运算符,例如结合以下方式

(x = 5) += y; 

因为表达x = 5回报左值的x

在C中,此代码将无效,因为在C中赋值表达式返回rvalue

1

在C++中内置复制赋值运算符产生一个可分配给的左值表达式。实际上就好像它是用引用类型结果声明的一样。

对于类类型,用户定义的复制赋值运算符可以具有任何返回类型,包括(其中IMO将是理想的)void。但是,如果一个类将被用作标准容器的项类型,那么它受制于标准库的需求,然后该类的复制赋值操作符必须返回对分配给该对象的对象的引用。

C++ 11§17.6.3.1/ 2(utility.arg.requirements/2),表22和23(从N3290):

enter image description here


为了声明复制赋值运算符为删除或默认值,它必须返回对赋值对象类型的引用,例如

struct S 
{ 
    auto operator=(S const&) -> S& = delete; 
}; 

用户定义的复制赋值运算符只能为一个类类型定义,而不是为枚举类型,因为它必须是一个非静态成员函数。