Отличие между const string &s и string &s

93
09 сентября 2019, 17:50

столкнулся с одной проблемой, и не могу понять, почему так происходит.

Допустим, есть некая функция

vector<std::string> split(const std::string &s, char delim) {}

Если её вызвать просто как vector<string>s = split("pam.pam", '.');, то всё будет хорошо и код отработает. Однако, если убрать в аргументах ключевое слово const, то программа не будет компилироваться. Почему так?

Answer 1

В ответ на ваше "pam.pam" компилятор создает временный объект типа std::string. Lvalue-ссылки можно привязывать ко временным объектам только если эти ссылки являются const. Так было всегда.

const std::string &s1 = "pam.pam"; // <- Все в порядке
std::string &s2 = "pam.pam";       // <- А так нельзя

Вопрос тут в том, зачем вам вдруг понадобилось убирать этот const. Если вы хотите модифицировать s внутри вашей функции и при этом считаете, что "само собой разумеется", что передаваемое пользователем значение аргумента будет модифицировано/повреждено/разрушено, то можно предоставить перегрузки

vector<std::string> split(std::string &s, char delim) 
{
  ...
}
vector<std::string> split(std::string &&s, char delim) 
{
  return split(s, delim);
}

Если же вы хотите, чтобы значение аргумента не разрушалось и при этом не делалось затрат на копирование, когда оно не нужно, то проще всего сделать

vector<std::string> split(std::string s, char delim) 
{
  ...
}

Оба варианта позволят вам делать

split("pam.pam", '.');
READ ALSO
Как добавить большой список слов в вектор?

Как добавить большой список слов в вектор?

Нужно добавить большой список слов в вектор

112
sprintf - формирование нескольких подсрок с использованием одного параметра

sprintf - формирование нескольких подсрок с использованием одного параметра

Подскажите, можно ли реализовать следующую задумку:

91
Ошибка считывания/записи переменной в 3х потоках с использованием atomic и без (с++)

Ошибка считывания/записи переменной в 3х потоках с использованием atomic и без (с++)

У нас есть 2 потока, которые асинхронно записывают в переменную tmp числа 322 и 1337Странность в том, что даже если переменная atomic, условие все-таки...

103
Необычное разбиение строки

Необычное разбиение строки

Имеется программа для разбиения строки по регулярному выражению (парсинг)Программа читает строку из файла, разбивает по ";", вписывает в вектор...

98