在c++中把引用声明为auto [重复]。

问题描述 投票:0回答:1

我不知道如何 自动 关键词的作用。下面是我的一个问题说明。

class Element {
  public:
    void setA(int a) {
      m_a = a;
    }

    int& a() {
      return m_a;
    }

  private:
    int m_a = 0;
};


int main(int argc, char* argv[])
{
  Element el;

  auto a = el.a();
  a = 2;
  // displays 2, 0
  std::cout << a << ", " << el.a() << std::endl;

  int& b = el.a();
  b = 3;
  // displays 3, 3
  std::cout << b << ", " << el.a() << std::endl;

  return 0;
}

在我的理解中: 自动 从使用它的上下文中推断出声明类型。这里,它应该推断出 a 变量是对整数的引用,因为 Element:a() 被声明为返回对整数引用的方法。

相反,似乎 a 变量是 Element 类的 m_a 属性的副本。

我发现我需要指定 auto& 来获取对属性的引用。但我不太明白为什么要加上安培符号。编译器不是应该知道如果 a 是由一个返回引用的方法初始化的,那么它也应该是一个引用?

c++ reference auto
1个回答
1
投票

编译器难道不应该知道,如果a是由一个返回引用的方法初始化的,那么它也应该是一个引用吗?

有可能,但这不是C++的工作方式。

表达式 el.a() 是一个 价值 int,而不是引用。表达式指的是原始对象,但此时已经去掉了引用限定符。这很复杂,也很混乱,但这就是C++的工作方式。因此,这也是 auto 的作品。

你要写 auto& 来获取一个新的引用。这样做的一个好处是,有语法可以得到一个副本,否则就不会有。

这就像为什么表达式 std::move(aThing) 是一个r值,类型为 T不属于 T&&纵然 std::move 从字面上看,是投向 T&&.

© www.soinside.com 2019 - 2024. All rights reserved.