如何验证返回的`auto`变量是否为引用

时间:2018-01-11 13:20:26

标签: c++ c++11 reference auto

在进行代码维护时,我发现了这样的代码:

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[]版本吗?
  • 这里适用哪些C ++规则?
  • 有没有办法使用auto ,以确保使用引用?

2 个答案:

答案 0 :(得分:7)

auto networkEntry = _networkEntries[key];

此处networkEntry永远不会是引用类型,因为auto type deduction rules会跟随template argument deduction rules

简而言之,您需要说:

  • auto& x = y;

    • 仅当y可以绑定到左值引用时才会编译。
  • auto&& x = y;

    • 将始终推断出引用类型, lvalue / rvalue 引用,具体取决于y的值类别。
  • decltype(auto) x = y;

    • 将精确推断出y的类型 - 可以推断出引用或值类型。请参阅What are some uses of decltype(auto)?

    • 正如Yakk所说,如果y不是引用类型,x将成为绑定到非引用临时y右值引用

为了推断参考。

答案 1 :(得分:3)

  1. 如果主叫网站上隐含的this指针为const,则会调用const版本的operator[],否则为非{{} 1}}版本被调用。因此,如果包含您的代码的函数为const,并且const是该类的成员变量,则将调用_networkEntries版本。

  2. 如上所述。

  3. 如果您需要参考,请使用const auto&作为调用网站的类型:auto