0

我有:

std::map<double, Foo> map;
for (auto&& [first, second] : map) { /* ... */ }

在哪里Foo声明的类在别处

我认为有两个问题:

1. 映射类型常量

secondFoo&是正确的,但您也可以使用 std::as_const 来实现const Foo&

for (auto&& [first, second] : std::as_const(map)) { /* ... */ }

所以这不是问题。

2.按值拷贝内置类型

firstconst double&对于内置类型来说是低效的。

有没有办法让first价值被接受?

我敢肯定这没有被忽视。

4

1 回答 1

0

首先是const double&内置类型效率低下。

您是否认为编译器会创建一个指针和一个指针取消引用来实现引用?

这不是真的。你的编译器很聪明。

这可能是函数参数的一个考虑因素,因为它们不能以相同的方式跨对象边界“优化”,但这不是你在这里所拥有的。

以下代码:

int a = 42;
const int& b = a;
std::cout << b << '\n';

与以下程序相同:

int a = 42;
std::cout << a << '\n';

它会编译成相同的指令。

您的 for 循环示例并不比这复杂得多。


第二个Foo&是正确的,但您也可以使用std::as_const它来制作const Foo&

for (auto&& [first, second] : std::as_const(map)) { /* ... */ }

所以这不是问题。

那么什么不是问题呢?这里没有问题。


tl;dr:不要试图解决不存在的问题。

于 2020-04-16T21:14:55.000 回答