先看一片代码:
class Container {public: std::vector<int>& GetData() { return data_; } std::vector<int> data_; };int main() { Container c; c.data_ = { 0,1,2,3 }; auto data = c.GetData();//这里data实际上是一个std::vector而非 std::vector& c.data_.push_back(10); for (auto& it : data) //这里实际上不会输出10 std::cout << it << std::endl; return 0; }
作者本来想让GetData函数返回一个引用,当后面push_back(10)的时候,这个引用里的值也应当变化。但是实际上这个auto data得到的值是一个值类型而非引用。要想让他成为一个引用。则必须这样写。
auto& data = c.GetData()
这说明一个事实是,auto 和 auto & 明显的区别,auto永远不会为你生成一个引用,只有你明确指出auto & 后面的变量才会是引用。