我不知道如何 自动 关键词的作用。下面是我的一个问题说明。
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 是由一个返回引用的方法初始化的,那么它也应该是一个引用?
编译器难道不应该知道,如果a是由一个返回引用的方法初始化的,那么它也应该是一个引用吗?
有可能,但这不是C++的工作方式。
表达式 el.a()
是一个 价值 int
,而不是引用。表达式指的是原始对象,但此时已经去掉了引用限定符。这很复杂,也很混乱,但这就是C++的工作方式。因此,这也是 auto
的作品。
你要写 auto&
来获取一个新的引用。这样做的一个好处是,有语法可以得到一个副本,否则就不会有。
这就像为什么表达式 std::move(aThing)
是一个r值,类型为 T
不属于 T&&
纵然 std::move
从字面上看,是投向 T&&
.