Как смешать auto с инициализацией скобки, чтобы правильно вернуть std :: pair? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть этот пример, который представляет собой функцию, которая возвращает std::pair, который содержит строковое значение и его размер.

std::pair<std::string, int> getLastPair(const vector<string>& vec) {
    return{ vec.back(), vec.back().size() };
}

int main(){

    vector<string> names{ "An", "Apple", "A", "Day", "Keeps", "The", 
    "Doctor", "Away"};

    auto p{getLastPair(names)}; // ok p is a pair<string, int>
    std::cout << p.first << " " << p.second << std::endl;
    std::cout << typeid(p).name() << std::endl;

    auto p2 = { getLastPair(names) }; // why it is not a pair but an initializer list?
    std::cout << typeid(p2).name() << std::endl; // initializer list


    std::pair<std::string, int> p3 = { getLastPair(names) }; // ok a pair
    std::cout << p3.first << " : " << p3.second << std::endl;

    decltype (getLastPair(names)) p4 = { getLastPair(names) }; // ok
    std::cout << p4.first << " : " << p4.second << std::endl; // ok


}
  • Почему при первой инициализации возвращается pairкак и ожидалось, но второй p2 - это не pair, а initializer_list вместо?

  • Как видите, p3 работает нормально (возвращает пару), покаЯ предоставил тип явно !?

  • Проблема в спецификаторе типа auto?

  • Также p4 отлично работает с decltype.

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