这种引用的使用不正确吗?

时间:2012-08-02 16:21:52

标签: c++ reference temporary

我有以下代码:

std::vector<A>& Get() { return some_object; };

for(int i=0; i<Get().size(); ++i) {
    x->push_back(Get()[i]);
}

但是当我第一次调用size()时,我得到了垃圾值。 我想某些临时删除但我不确定... 谁能告诉我发生了什么?

编辑:我的some_object是一个静态向量,因此在此示例中它永远不会被删除

4 个答案:

答案 0 :(得分:5)

我建议更换for循环。我不相信循环。太多的地方容易爬虫。

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

答案 1 :(得分:3)

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

由于引用是静态向量,因此引用似乎不可能是错误的。静态物体不会消失。

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

答案 2 :(得分:2)

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

要解决此问题,您可以使用construct on first use惯用法。使用这个习惯用法,您可以在第一次需要时懒惰地构造静态/全局对象。这可确保在访问静态对象时创建彼此依赖的静态对象。

对于您的示例,您可以执行以下操作:

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设计模式。

注意:如果您的程序是多线程的,则必须使用此技巧的变体。

答案 3 :(得分:1)

仅当some_object生命周期仅限于Get的正文时才会出错。