Почему я не могу вставить константный указатель в 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);
}
Другие вопросы по тегам