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

Flo*_*dis 1 c++ reference auto c++11

在进行代码维护时,我找到了这样的代码:

auto networkEntry = _networkEntries[key];
networkEntry.port = port;
networkEntry.scope = scope;
Run Code Online (Sandbox Code Playgroud)

用于的地图数据类型_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;
};
Run Code Online (Sandbox Code Playgroud)

地图中使用的数据类型很简单struct.

现在我只是想知道,返回的值auto可以是数据结构的副本,也可以是对数据结构的引用.如果返回副本,则分配不会影响映射中的存储值.

我对这个案子有三个相关的问题:

  • 我可以知道或测试operator[]使用的是哪个版本?
  • 哪些C++规则适用于此处?
  • 有没有办法,使用auto,以确保使用参考?

Vit*_*meo 7

auto networkEntry = _networkEntries[key];
Run Code Online (Sandbox Code Playgroud)

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

简而言之,您需要说:

  • auto& x = y;

    • 只有在y可以绑定到左值引用时才会编译.
  • auto&& x = y;

    • 将始终推导出一个引用类型,lvalue/rvalue 引用取决于值的类别y.
  • decltype(auto) x = y;

    • 将精确推断出y它的类型- 它可以推导出引用或值类型.看看decltype(auto)有哪些用途?.

    • 正如Yakk所说,如果y不是引用类型,则x成为绑定到非引用临时的rvalue引用y.

为了推断出一个参考.