C ++ новый оператор if с инициализатором - PullRequest
0 голосов
/ 04 января 2019

Страница cppreference для оператора if;

https://en.cppreference.com/w/cpp/language/if

приводит следующий пример:

За исключением тех имен, которые объявлены оператором init (если init-оператор является объявлением) и имен, объявленныхпо условию (если условие является объявлением) находятся в одной и той же области видимости, которая также является областью действия обоих операторов. Blockquote

std::map<int, std::string> m;
if (auto it = m.find(10); it != m.end()) { return it->size(); }

Это опечатка, не так ли?Я ничего не упускаю здесь, я, это должно быть;

it->second.size(); 

или

it->first;

Нет?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Да, это опечатка.iterator для std::map будет разыменовано как std::map::value_type, где value_type равно std::pair<const Key, T>.

См. Пример использования для std::map::find (из cppreference):

#include <iostream>
#include <map>
int main()
{  
    std::map<int,char> example = {{1,'a'},{2,'b'}};

    auto search = example.find(2);
    if (search != example.end()) {
        std::cout << "Found " << search->first << " " << search->second << '\n';
    } else {
        std::cout << "Not found\n";
    }
}
0 голосов
/ 04 января 2019

Вы правы.Код в том виде, в котором он указан, не компилируется.Смотрите здесь .Ошибка компилятора:

error: 'struct std::pair<const int, std::__cxx11::basic_string<char> >' has no member named 'size'

std::pair не имеет члена size.Но у std::string есть.

Поэтому правильный код должен быть:

if (auto it = m.find(10); it != m.end()) { return it->second.size(); }
...