【发布时间】:2022-01-11 11:37:57
【问题描述】:
在运算符重载中,赋值运算符通常定义如下:
T& T::operator =(const T2& b);
返回T& 作为结果。但我想知道当我们返回void 时会发生什么。比如std::atmoic<std::shared_ptr<T>>的赋值运算符返回void:
void operator=( std::shared_ptr<T> desired ) noexcept;
定义为 here 和 here。在这种情况下会发生什么?总是这样实现赋值运算符可以吗?我想这会阻止像 a=b=c; 这样的分配,这有时很好,不是吗?
【问题讨论】:
-
赋值就像任何其他二进制表达式一样,因此可以嵌套在其他表达式中。在链式分配之外它可能不常见,但仍然允许。通过返回
void,您破坏了赋值运算符的标准语义。 -
“这有时很好,不是吗?” - 我不能说我曾经使用过
a=b=c;,它只是不如单独做作业好恕我直言。 -
请注意,
std::atomic是不可复制和不可移动的,因此链接分配没有多大意义。 -
@Nick 我的意思是有时阻止这样的分配是好的.... :D
-
@DanielLangr 你认为至少在类不可复制时返回
void是一个好习惯吗?
标签: c++ void return-type assignment-operator