在进行代码维护时,我发现了这样的代码:
auto networkEntry = _networkEntries[key];
networkEntry.port = port;
networkEntry.scope = scope;
_networkEntries
使用的地图数据类型有operator[]
的两个重载版本:
template<class T>
class Map {
// ... simplified STD compatible container ...
T & Map::operator[](const Key & key);
const T Map::operator[](const Key & key) const;
};
地图中使用的数据类型很简单struct
。
现在我只是想知道,auto
的返回值可以是数据结构的副本,也可以是对数据结构的引用。如果返回副本,则分配不会影响地图中存储的值。
我对此案有三个相关问题:
operator[]
版本吗? auto
,以确保使用引用? 答案 0 :(得分:7)
auto networkEntry = _networkEntries[key];
此处networkEntry
永远不会是引用类型,因为auto
type deduction rules会跟随template argument deduction rules。
简而言之,您需要说:
auto& x = y;
y
可以绑定到左值引用时才会编译。 auto&& x = y;
y
的值类别。 decltype(auto) x = y;
将精确推断出y
的类型 - 可以推断出引用或值类型。请参阅What are some uses of decltype(auto)?。
正如Yakk所说,如果y
不是引用类型,x
将成为绑定到非引用临时y
的右值引用
为了推断参考。
答案 1 :(得分:3)
如果主叫网站上隐含的this
指针为const
,则会调用const
版本的operator[]
,否则为非{{} 1}}版本被调用。因此,如果包含您的代码的函数为const
,并且const
是该类的成员变量,则将调用_networkEntries
版本。
如上所述。
如果您需要参考,请使用const
不 auto&
作为调用网站的类型:auto
。