C++ 引用和 STL 容器的范围[重复]

问题描述 投票:0回答:1

我有以下代码片段(为了简单起见,这是一个简单的代码示例):

#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) 没有问题,但我不太了解内部行为。

c++ scope reference stl
1个回答
1
投票

如果您有

const std::string &msg
std::vector<std::string> messages
,则操作
messages.push_back(msg);
会生成副本。

向量拥有其内容并负责管理它们。

此后引用失效不再是问题。

如果您有一个指向其他人拥有的字符串的指针向量,情况会有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.