C++ 为什么赋值运算符首先返回任何内容?

C++ 为什么赋值运算符首先返回任何内容?,c++,operator-overloading,C++,Operator Overloading,我知道“+”操作符必须返回一些东西,这对我来说很有意义 但我不明白的是,为什么我们在重载“=”运算符时返回一个对象。例如,请看以下内容: const Scene& Scene::operator=(const Scene &source){ if(this != &source){ count = source.count } return *this; } 我们就不能用这个来达到同样的效果吗 void Scene::opera

我知道“+”操作符必须返回一些东西,这对我来说很有意义

但我不明白的是,为什么我们在重载“=”运算符时返回一个对象。例如,请看以下内容:

const Scene& Scene::operator=(const Scene &source){
    if(this != &source){
         count = source.count
    }
    return *this;
}
我们就不能用这个来达到同样的效果吗

void Scene::operator=(const Scene &source){
    if(this != &source){
         count = source.count
    }
}

=
运算符的语义是,您可以链接分配:

a = b = c;

您必须返回一个对象才能使其有意义。

操作符的语义是您可以链接分配:

a = b = c;
您必须返回一个对象才能使其有意义。

您可以返回一个引用,该引用支持中的赋值链接

a = b = 42;
…由于
=
是右关联的,因此将其解析为

a = (b = 42);
…以便
a
b
都设置为
42

但是,您不必让赋值运算符返回任何内容,除非您希望支持在标准库集合中使用对象

不幸的是,标准库要求集合中的项(如果需要可赋值)必须提供一个赋值运算符,该运算符返回对该对象的引用

您还需要使用该声明形式,以便
删除类的赋值运算符或
默认值。

您可以返回一个引用,该引用支持中的赋值链接

a = b = 42;
…由于
=
是右关联的,因此将其解析为

a = (b = 42);
…以便
a
b
都设置为
42

但是,您不必让赋值运算符返回任何内容,除非您希望支持在标准库集合中使用对象

不幸的是,标准库要求集合中的项(如果需要可赋值)必须提供一个赋值运算符,该运算符返回对该对象的引用


您还需要使用这种声明形式,以便
删除类的赋值运算符
默认值

@LogicStuff-我不确定是否遵循。你在问什么?你可能还想链接
(a=b)==c
-不是所有的作业。我个人认为链接作业不是一种好的做法,但返回本身对
if(myOptional=functionthattgeneratesoptional()等内容有帮助
它允许我将可选项绑定到变量,并立即测试其真实性。虽然我也不会这么做。哦,我明白了。是的,你想做什么就做什么。我刚才只是举了一个惯用的例子。@LogicStuff-我不太明白。你在问什么?你可能还想链接
(a=b)==c
-不是所有的作业。我个人认为链接作业不是一种好的做法,但返回本身对
if(myOptional=functionthattgeneratesoptional()等内容有帮助
它允许我将可选项绑定到变量,并立即测试其真实性。虽然我也不会这么做。哦,我明白了。是的,你想做什么就做什么。我只是举了一个惯用的例子
,非错误的
如果(a=b){…
,并赋值,然后在同一行的表达式中使用它:
a=b+(c=d);
对于
a=b=c;
,非错误的
如果(a=b){…
,并赋值,然后在同一行的表达式中使用它:
a=b+(c=d);