这种引用的用法不正确吗

is this use of references incorrect?

本文关键字:不正确 用法 引用      更新时间:2023-10-16

我有以下代码:

std::vector<A>& Get() { return some_object; };
for(int i=0; i<Get().size(); ++i) {
    x->push_back(Get()[i]);
}

但当我第一次调用size()时,我得到了垃圾值。我想在某个地方删除了一些临时的,但我真的不确定。。。有人能告诉我发生了什么事吗?

edit:我的some_object是一个静态向量,所以在这个例子中它从未被删除

我建议替换for循环。我不相信循环。虫子爬进来的地方太多了。

std::vector<A>& v = Get();
x.insert(x.end(), v.begin(), v.end());

只有两种可能性——引用不好,或者对象本身不好。

由于引用是一个静态向量,所以引用不可能是坏的。静态对象不会消失。

这就留下了对象本身。是否有可能在初始化静态对象之前调用函数?如果从另一个静态对象的构造函数调用它,则可能会发生这种情况。

如果您的for循环是在全局或静态对象的构造函数的上下文中执行的,那么您将遇到一个称为静态初始化顺序惨败(SIOF)的问题。简而言之,SIOF意味着我们不能依赖于静态对象的构造顺序。

为了解决这个问题,您可以在首次使用习语时使用构造。使用这个习惯用法,您可以在第一次需要静态/全局对象时惰性地构建它们。这样可以确保在访问彼此依赖的静态对象时创建它们。

举个例子,你可以这样做:

std::vector<A>& Get()
{
    // 'instance' will be constructed "on demand" the first time this
    // function is called.
    static std::vector<A> instance;
    return instance;
};

这个技巧也用于实现Singleton设计模式。

注意:如果你的程序是多线程的,你必须使用这个技巧的变体。

只有当some_object的生存期仅限于Get的主体时,这是不正确的。