Почему я не могу вставить константный указатель в std::vector?
Рассмотрим кусок кода:
class T;
void constructVector(const T* item)
{
std::vector<T*> v;
v.push_back(item);
}
Я получаю сообщение об ошибке с компилятором MSVC 2010:
ошибка: C2664: 'void std:: vector<_Ty>:: push_back (_Ty &&)': невозможно преобразовать параметр 1 из 'const T *' в 'T *&&' с помощью [ _Ty=T * ]. Преобразование теряет квалификаторы.
Я вижу, что это конкретное преобразование является незаконным, но я не верю, что мой код семантически неверен. Я также считаю, что есть push_back(const T&)
вариант, почему это не соответствует моему звонку?
2 ответа
Потому что это вектор неконстантных указателей. Он не будет преобразовывать константный указатель в неконстантный указатель. Это победило бы цель const.
Я считаю, что push_back(const T&) - это не то, что вы ищете, потому что это делает сам объект T const, он не меняет тип T с (*) на (const *).
Вы можете сделать вектор вектором константных указателей:
void constructVector(const T* item)
{
std::vector<const T*> v;
v.push_back(item);
}
Или вы можете изменить свою функцию, чтобы она брала неконстантный указатель:
void constructVector(T* item)
{
std::vector<T*> v;
v.push_back(item);
}
Капля const
void constructVector (const T * item);
или же
Использование:
void constructVector(const T* item)
{
std::vector<const T*> v;
v.push_back(item);
}