【发布时间】:2018-01-16 12:30:53
【问题描述】:
我看到下面的代码here。描述说:
我们还可以使用 auto&& 捕获作为转发引用。那是, auto&& 将解析为 auto& 用于左值引用,而 auto&& 用于 重估参考。这是一个捕获输出的示例 在临时地图上基于范围的 for 循环。
如果引用的值是左值,我确实理解 auto&& 到 auto& 的衰减(所以在这种情况下没有衰减)。我努力的是了解临时地图、基于范围的 for 循环和移动的值如何协同工作。您是否愿意解释一下这些东西是如何相互配合的,以及为什么可以从一个正在迭代的临时对象中迁移出来。
#include <iostream>
#include <map>
std::map<std::string, int> get_map()
{
return {
{ "hello", 1 },
{ "world", 2 },
{ "it's", 3 },
{ "me", 4 },
};
}
int main() {
for (auto&& [ k, v ] : get_map())
std::cout << "k=" << k << " v=" << v << '\n';
}
【问题讨论】:
-
为简洁起见,您已经了解reference collapsing。对吗?
-
仅供参考:这里没有任何进展,只是函数返回中可能存在 RVO
-
@RichardCritten 因为它被标记为 [c++1z],所以没有“潜在的 RVO”。这是暂时的,在 for 循环需要它之前绝对不会实现。在 C++17 之前,它是实现定义的,但在这里它是必需的,不再与 RVO 完全一样。