столкнулся с одной проблемой, и не могу понять, почему так происходит.
Допустим, есть некая функция
vector<std::string> split(const std::string &s, char delim) {}
Если её вызвать просто как vector<string>s = split("pam.pam", '.');
, то всё будет хорошо и код отработает. Однако, если убрать в аргументах ключевое слово const
, то программа не будет компилироваться. Почему так?
В ответ на ваше "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", '.');
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите, можно ли реализовать следующую задумку:
У нас есть 2 потока, которые асинхронно записывают в переменную tmp числа 322 и 1337Странность в том, что даже если переменная atomic, условие все-таки...
Имеется программа для разбиения строки по регулярному выражению (парсинг)Программа читает строку из файла, разбивает по ";", вписывает в вектор...