【问题标题】:Operator overload which permits capturing with rvalue but not assigning to运算符重载,允许使用右值捕获但不分配给
【发布时间】:2011-08-18 22:09:16
【问题描述】:

是否可以设计以及我应该如何为我的班级operator+ 重载C 以实现这一点:

C&& c = c1 + c2;

但这不可能:

c1 + c2 = something;

编辑: 我将对象更改为小写字母。 c1c2c 是类 C 的对象。 && 不是逻辑上的 operator&&,而是一个右值引用。

例如写作:

double&& d = 1.0 + 2.0;

是 100% 正确的(新)C++ 代码,而

1.0 + 2.0 = 4.0;

显然是编译器错误。我希望 完全相同 相同,但要为我的班级 C 加倍。

第二次修改: 如果我的运算符返回 C 或 C&,我可以赋值给右值引用,也可以赋值给 c1 + c2,这是没有意义的。在这里给出 const 会禁用它,但是它也会禁用对右值的分配。至少在 VC++ 2k10 上。那么这个是多少倍呢?

【问题讨论】:

  • 这没有任何意义!请提供更多详细信息。
  • 请解释您的代码示例的语义(预期结果)。
  • 不会double&& d = 1. + 2.; 创建一个悬空引用吗?另外,不能只按值返回吗?
  • 正如我所说,如果我按值返回,那么 c1 + c2 = 某些事情将成为可能,这不是我想要的。
  • @Fred:我不知道他们已经扩展了规则以包含 r 值引用,但我想他们会这样做是有道理的。

标签: c++ operator-overloading c++11 rvalue-reference


【解决方案1】:

赋值运算符只能在左值上调用:

class C
{
    // ...

public:

    C& operator=(const C&) & = default;
};

注意右括号后的单个 & 符号。它可以防止分配给右值。

【讨论】:

  • 谢谢,那会很酷。但是我的 VC++ 2k10 在这里不接受 & 符号。正如我所假设的那样,它应该并且有一天它会(或者他从未有过的版本;))在当前的 VC++ 2k10 中有没有办法做到这一点?
  • @Argbart:不。确实存在语言功能来实现这一点,但在 Visual Studio 2010 中不存在。请记住,VS 的右值引用实现相对较旧,只有在出现问题时才会更新。在标准的未来版本中,您可以根据类是左值还是右值来重载成员函数。
  • @DeadMG:哇,太酷了,我不知道!还要感谢您,我还想将您的评论标记为答案并给您一些分数,但这显然是不可能的。无论如何,即使对我没有用,FredOverflow 的提议也是绝对正确的。我将此标记为答案。
  • @DeadMG:再提一个问题。创建以 C&& 作为参数的构造函数是否有意义?由于返回值优化,这不是不必要的吗?
  • @Argbart:为你点赞@DeadMG 的评论。构造函数C(C&&); 是一个移动构造函数并且确实有意义,特别是如果它可以通过从即将被销毁的参数中“窃取”东西来比复制构造函数更有效。
猜你喜欢
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多