Почему я не могу получить тип элемента вектора, передаваемого по универсальной ссылке? C++

Есть такой код:

template<typename Container>
void foo(Container&& c) {
    
    std::cout << typeid(Container::value_type).name() << "\n";

}

Компилятор выдает ошибку, что Container - это не класс. Сделал так:

std::cout << typeid(Container).name() << "\n";

В консоль вывелось class std::vector<int,class std::allocator>, разве это не значит, что Container - это все таки класс вектора? Почему тогда я не могу получить доступ к value_type?


Ответы (1 шт):

Автор решения: KoVadim

У Вас Container это не просто тип, а std::vector<int>& (или другие подобные). Поэтому, удалим ссылочность. Это можно сделать двумя способами

std::cout << typeid(typename std::decay<Container>::type::value_type).name() << "\n";

или

std::cout << typeid(typename std::remove_reference<Container>::type::value_type).name() << "\n";

то есть, удаляем тип не у Container::value_type, а вначале снимаем ссылку с Container, а потом у него уже берем вложенный тип.

→ Ссылка