如何验证返回的“auto”变量是否为引用
How to verify if returned `auto` variable is a reference
在进行代码维护时,我发现了这样的代码:
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
的右值引用。
为了推断出一个参考。
-
如果调用站点的隐含
this
指针为const
,则将调用operator[]
的const
版本,否则调用非const
版本。因此,如果包含代码的函数是const
,并且_networkEntries
是该类的成员变量,则将调用const
版本。 -
同上。
-
如果需要引用,请使用
auto&
notauto
作为调用站点的类型:auto& networkEntry = _networkEntries[key];
。
相关文章:
- 'auto *x = new some_struct{};"是一个未初始化的变量?
- 是否有用于"go to variable type definition" C++中"auto"变量的 Visual Studio 键盘快捷方式?
- "decltype(auto)"变量是否有任何实际用例?
- “auto”每次创建一个新的变量实例
- 如何验证返回的“auto”变量是否为引用
- C++11 外部作用域变量声明为 auto
- 使用 C++11 auto 关键字声明两个(或多个)变量
- 什么时候应该使用 decltype(x) 而不是 auto 来声明变量的类型
- for(auto&x:unordered_map变量) - 此语句抛出错误
- 使用auto声明变量和使用类型名称之间的区别是什么
- 从模板中的迭代器推断变量的类型,out使用auto
- 声明变量而不初始化变量的最佳实践,因此auto不可用
- 哪些 IDE 和文本编辑器可以推断出在 C++11 中使用 auto 关键字声明的变量类型
- C++函数,使用'auto'变量返回类型
- 无法在代码中完成 C++11 的"auto"变量::块
- auto&& 变量不是右值引用
- 如何在C++中使用关键字"auto"声明和使用变量?
- 是否可以有一个"auto"成员变量?
- 避免重复变量类型:Return type Resolver、C++11 auto、..其他任何东西
- 如何从“auto”变量推导类型