#include <iostream>
#include <string>
#include <vector>
class SampleClass
{
public:
SampleClass(){}
void ReceiveNewMessage()
{
const auto msg = GenerateSomeRandomMessage();
StoreUniqueMessage(msg);
}
private:
void StoreUniqueMessage(std::string msg)
{
messages.push_back(msg);
}
std::string GenerateSomeRandomMessage()
{
return "Random message";
}
std::vector<std::string> messages{};
};
int main() {
SampleClass sc;
sc.ReceiveNewMessage();
return 0;
}
Clang предлагает использовать следующую подпись:
void StoreUniqueMessage(const std::string& msg);
Однако, поскольку ссылки являются псевдонимом референта, поведение при уничтожении референта не определено (поправьте меня, если ошибаюсь); в этом случае внутри ReceiveNewMessage() переменная msg является локальной для этой функции, но если я использую ссылку на нее в StoreUniqueMessage(), не будет ли это неопределенным поведением, когда функция выходит за пределы области видимости? Что мне не хватает в ссылках?





Если у вас есть const std::string &msg и std::vector<std::string> messages, операция messages.push_back(msg); создает копию.
Вектор владеет своим содержимым и заботится о нем.
То, что после этого ссылка станет недействительной, больше не является проблемой.
Если бы у вас был вектор указателей на строки, принадлежащие кому-то другому, ситуация была бы другой.
поскольку ваше внутреннее хранилище — это
std::vector<std::string>, а неstd::vector<const std::string&>, при вызовеpush_backбудет создана копия. Изменение сигнатуры функции наconst&предотвратит одну копию строки, поскольку она не будет копироваться при вызове функции, а только при вызовеpush_back.