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

How to verify if returned `auto` variable is a reference

本文关键字:auto 变量 是否 引用 何验证 验证 返回      更新时间:2023-10-16

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

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 来确保使用引用?
auto networkEntry = _networkEntries[key];

在这里,networkEntry永远不会是引用类型,因为auto类型推断规则遵循模板参数推断规则。

简而言之,您需要说:

  • auto& x = y;

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

    • 将始终推断出引用类型,根据y的值类别推断出值/右值引用
  • decltype(auto) x = y;

    • 将准确推断出y的类型 - 它可以推断出引用或值类型。请参阅 decltype(auto( 有哪些用途?。

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

为了推断出一个参考。

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

  2. 同上。

  3. 如果需要引用,请使用 auto& not auto 作为调用站点的类型:auto& networkEntry = _networkEntries[key];