【问题标题】:What happens when opeator= returns void rather than T&?当 operator= 返回 void 而不是 T& 时会发生什么?
【发布时间】: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;

定义为 herehere。在这种情况下会发生什么?总是这样实现赋值运算符可以吗?我想这会阻止像 a=b=c; 这样的分配,这有时很好,不是吗?

【问题讨论】:

  • 赋值就像任何其他二进制表达式一样,因此可以嵌套在其他表达式中。在链式分配之外它可能不常见,但仍然允许。通过返回void,您破坏了赋值运算符的标准语义。
  • “这有时很好,不是吗?” - 我不能说我曾经使用过a=b=c;,它只是不如单独做作业好恕我直言。
  • 请注意,std::atomic 是不可复制和不可移动的,因此链接分配没有多大意义。
  • @Nick 我的意思是有时阻止这样的分配是好的.... :D
  • @DanielLangr 你认为至少在类不可复制时返回void 是一个好习惯吗?

标签: c++ void return-type assignment-operator


【解决方案1】:

您将无法链接作业

a = b = c;

(也不介绍更复杂的情况,比如(a = b).method();if((a = b));。)

OTOH,使用 void 返回类型,您不需要无处不在的return *this; 样板。

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多