c++ - 为什么我的 const ref 无效?

标签 c++ reference invalidation

为什么我的 const ref 在此代码中变得无效以及如何避免这种情况?我无法复制,这是我应用程序的瓶颈。

class Foo {
public:
    const std::string& string() const {
        return string;
    }

private:
    std::string string = "asdf";
};

Foo foo;
std::vector<std::pair<const std::string&, int>> invalid;
for (int i = 0; i < 5; i++) {
    invalid.emplace_back(std::make_pair(foo.string(), i);
    // after this line invalid[i].first is invalid
}

最佳答案

Igor Tandetnik 已经指出了您代码中的问题。 FWIW,我认为在任何情况下让容器通过引用来引用其他对象的成员都不是一个好主意——这隐含地依赖于对象的相对生命周期。您可以考虑使用 shared_ptr to const string ,如下所示:

#include <string>
#include <memory>
#include <vector>                                                                                                                           
class Foo {
public:
    const std::shared_ptr<const std::string> string() const {
        return _string;
    }   

private:
    std::shared_ptr<std::string> _string = std::make_shared<std::string>("asdf");
};  

int main()
{   
    Foo foo;
    std::vector<std::pair<std::shared_ptr<const std::string>, int>> invalid;
    for (int i = 0; i < 5; i++) {
        invalid.emplace_back(std::make_pair(foo.string(), i));
    }   
}   

关于c++ - 为什么我的 const ref 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235944/

相关文章:

c++ - 我需要哪些库才能使用 std::placeholders?

emacs - 组织模式表公式引用列表

Android toggleButton.setOnText 和 .invalidate 不刷新文本

c++ - 如何在 C++ 中使用 HRESULT 条件检查

c++ - 在 QTextEdit 中连接复制消息和主消息

c# - 克隆一个包含许多对象并列出的对象 C#

PHP:通过引用实例化类?

iphone - 如何正确地使 NSTimer 失效

Android:什么时候调用invalidate()?

C++程序比较5个人的年龄并打印最年长的人的名字