У меня есть функция, которую я хочу принять const vector<const string>
но я также хочу, чтобы пользователь мог передать vector<string>
. Я думал, что могу просто сделать аргумент функции ссылкой на const и что неконстантный вектор все равно будет принят, но это не так. Вот пример:
void test(const vector<const string> &v)
{
return;
}
int main( int argc, char *argv[] )
{
vector<string> v;
test(v);
return 0;
}
Ошибка, которую я получаю:
error C2664: 'test' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'const std::vector<_Ty> &'
Почему этот пример не работает и как вы предлагаете мне заставить мою функцию работать, чтобы пользователь мог передать const vector<const string>
и vector<string>
? благодаря
Возможно, это сообщение может вам помочь. Однако вы можете заставить свой вызов этим (ужасным) способом
test(*reinterpret_cast<vector<const string>*>(&v));
что в некотором роде также иллюстрирует, почему автоматическое преобразование невозможно. Вы можете нарушить правила контейнера:
vector<string> v = {"a", "b"};
vector<const string>& vc = v; //not allowed, of course
v[0].clear(); //<-- but also vc[0] is cleared
const string
я ставлю под сомнение сам дизайн. Доступ к элементам и их модификация уже ограничены в связи сconst&
природой самого вектора, так что именно вы надеетесь получить , сделав в первую очередьconst string
типаconst string
.