Получение встроенных типов по значению в объявлении структурированной привязки в диапазоне для std :: map - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть:

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

, где Foo - это класс, объявленный в другом месте

Есть 2 проблемы, которые я вижу в нынешнем виде:

1. Сопоставленный тип constness

second здесь Foo&, что правильно, но вы также можете использовать std :: as_const, чтобы сделать его const Foo&

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

, так что это не проблема.

2. По значению копии встроенных типов

first здесь const double&, что неэффективно для встроенных типов.

Есть ли способ заставить first быть взятым по значению ?

Я уверен, что это не было упущено.

1 Ответ

0 голосов
/ 17 апреля 2020

сначала здесь const double&, что неэффективно для встроенных типов.

Вы думаете, что компилятор создаст указатель и разыменование указателя, чтобы реализовать ссылку ?

Это не совсем так. Ваш компилятор умен.

Это может быть рассмотрено для аргументов функции, потому что они не могут быть "оптимизированы" таким же образом через границы объекта, но это не то, что у вас есть здесь.

Следующий код:

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

- это та же программа, что и:

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

, и она будет скомпилирована по тем же инструкциям.

Ваш for-l oop пример не намного сложнее, чем этот.


секунда здесь Foo&, что правильно, но вы также можете использовать std::as_const, чтобы сделать его const Foo&

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

, поэтому это не проблема.

Так в чем не проблема? Здесь нет проблем.


tl; dr: Не пытайтесь исправить проблемы, которые не существуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...