【问题标题】:Post-increment in assignment to reference c++分配给参考c ++的后增量
【发布时间】:2015-09-14 08:59:18
【问题描述】:

假设我有这个代码:

int i = 2;
int &ref = i++;

现在,我知道引用不能用右值初始化, 但我不明白为什么ref 没有用左值初始化,这里的意思是i,然后i 递增。

此外,在以下情况下:

   int i = 2;
   const int &ref = i++;
   cout << ref << endl;

2 将被打印出来,这意味着ref 在递增之前用i 初始化,即用lval 初始化。 之后ref 递增,但ref 为常量。

有人可以解释一下我在这里缺少什么吗?

【问题讨论】:

    标签: c++ reference post-increment


    【解决方案1】:

    后递增 int 不会产生左值。一个假设的实现可能如下所示:

    int operator++(int& i) {
        int temp = i;
        ++i;
        return temp;
    }
    

    如您所见,需要制作副本并按值返回。

    预增量确实会产生一个左值,因为不需要复制,所以结果是对原始的引用。

    您的第二个示例有效,因为右值可以绑定到引用到常量。

    【讨论】:

    • 酷!我应该考虑一下这个运营商的实施,你说得对!谢谢!
    • 正如 Tartan 所写的 i++ 不返回左值。作为 C++ 标准的补充:5.2.6 Increment and decrement [...] The result is a prvalue. [...]。还要检查解释(这里)[en.cppreference.com/w/cpp/language/reference_initialization] 使用prvalue 初始化 const-ref 时会发生什么@
    【解决方案2】:

    i++ 不返回i,而是一个临时副本,它是在我递增之前拍摄的。 这就是为什么它被称为 POST 增量,因为它在保留当前状态的副本之后递增 w 变量。

    【讨论】:

    • 通常在返回之前递增,例如看看 TartanLlama 的实现。关键是返回旧值。
    【解决方案3】:

    增加 int 后不会返回左值。 i++ 在自增之前返回一个临时副本。

    【讨论】:

      猜你喜欢
      • 2014-11-10
      • 2023-03-09
      • 2011-01-08
      • 2016-02-20
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多