У меня есть этот пример, который представляет собой функцию, которая возвращает 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
.