Выведенный тип в структурированном связывании unordered_map - PullRequest
3 голосов
/ 06 ноября 2019

Я пытаюсь увидеть выведенный тип в структурированной привязке для unordered_map, используя auto, auto & и auto &&.

#include <string>
#include <iostream>
#include <unordered_map>
#include <type_traits>

int main() {   

    std::unordered_map<std::string, std::string> m{{"a","a1"}, {"b","b1"}};

    for(auto &&  [k,v]:m)
    {
        std::cout << std::is_same<decltype(k), std::string const  >::value << '\n';
        std::cout << std::is_same<decltype(v), std::string >::value << '\n';

    }
}

Независимо от того, что я использую for(auto [k,v]:m) или for(auto & [k,v]:m) или for(auto && [k,v]:m), вывод всегда

1
1

Мои вопросы:

  • почему decltype(k) и decltype(v) не являются ссылочными типами в данном случаеfor(auto & [k,v]:m) или for(auto && [k,v]:m)?

  • , почему decltype(k) имеет тип const в случае for(auto [k,v]:m)?

1 Ответ

4 голосов
/ 06 ноября 2019

Вопрос 1) Как указано здесь

1) Если аргумент является не заключенным в скобки id-выражением, именующим структурированную привязку, то decltype возвращает ссылку тип (описан в спецификации объявления структурированной привязки).

и здесь :

Случай 2: привязка типа, подобного кортежу [...] Ссылочный тип для i-го идентификатораis std::tuple_element<i, E>::type.

A std::pair (см. ответ на вопрос 2) фактически является кортежем 2. Таким образом, это 'tuple- подобно '.

Таким образом, в этом случае базовый тип Key и T всегда возвращаются (даются).

Вопрос 2) Внутренне unordered_map выделяется как std::pair<const Key, T>. Следовательно, k равно const.

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