我有以下代码片段(为了简单起见,这是一个简单的代码示例):
#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() 中使用对它的引用,那么当函数超出范围时,这不是未定义的行为吗?我缺少什么参考资料?
我知道将函数签名修改为 StoreUniqueMessage(const std::string& msg) 没有问题,但我不太了解内部行为。
如果您有
const std::string &msg
和 std::vector<std::string> messages
,则操作 messages.push_back(msg);
会生成副本。
向量拥有其内容并负责管理它们。
此后引用失效不再是问题。
如果您有一个指向其他人拥有的字符串的指针向量,情况会有所不同。