当前位置: 首页 > 知识库问答 >
问题:

基于范围的for循环中的临时对象

华哲茂
2023-03-14

在临时范围上基于范围的for循环中,Barry提到以下内容不受被破坏的临时对象的影响,我测试的成员v确实存在于for循环的整个循环中(因为在for循环的整个循环中没有调用析构函数X)。解释是什么?

struct X {
    std::vector<int> v;

    ~X()
    {
    }
};

X foo()
{
    return X();
}

for (auto e : foo().v) {
    // ok!
}

共有1个答案

景子安
2023-03-14

这是一种模糊的临时寿命延长形式。通常,您必须将临时文件直接绑定到引用才能使其工作(例如,for(auto x:foo())),但根据cppreference,这种效果通过以下方式传播:

  • 括号()(分组,不是函数调用),
  • 数组访问[]
  • 成员访问。*
  • 三元运算符?:
  • 逗号运算符
  • 任何不涉及“用户定义转换”的强制转换(大概不使用构造函数或转换运算符)

即。如果a. b绑定到引用,则a的生命周期会延长。

 类似资料:
  • 由于valgrind中出现了一些分段错误和警告,我发现这段代码不正确,并且在for range循环中有一些悬而未决的引用。 看起来好像开始和结束是从一个临时循环中提取的,并且在循环中丢失了。 当然,一种方法是 然而,我想知道为什么for(auto e:f()[5])是一个错误,以及是否有更好的方法或某种方法来设计f,甚至容器(

  • 对于我的项目,我需要使循环中的迭代器转到容器中的下一项,执行一些操作,然后再次返回到同一迭代器,然后继续,然而,由于某种原因,和,然后使用似乎都不起作用。那么,我怎样才能得到下一个迭代器,然后返回到上一个迭代器呢? 我收到以下错误消息: 非常感谢。

  • 考虑基于范围的for循环的begin expr和end expr的规范(N4140[标准范围]/p1)。给定类型为RangeT的范围, 开始表达式和结束表达式的确定如下: 如果“范围”是数组类型,则“开始表达式”和“结束表达式”分别是“范围”和“范围绑定”,其中“范围绑定”是数组绑定。如果RangeT是大小未知的数组或类型不完整的数组,则程序格式错误 如果RangeT是类类型,则在类RangeT的

  • 我对C很陌生,现在就在做中学习。在课堂材料中,我有以下功能: 几分钟前,我像这样使用了普通for循环:

  • 我在实验基于范围的for循环时发现,如果你使用基于范围的for循环来循环一个向量,它会出现超出范围的错误,如果你使用基于范围的for循环,有没有办法避免这个错误 它会显示此错误

  • 这是从2011年开始对这个问题的扩展:基于范围的for loops和ADL 使用Visual Studio 2015,我无法使用参数依赖查找(ADL)为自定义容器创建基于范围的for循环。 我在下面用一个自定义容器做了一个非常简单的测试用例: 使用此容器和ADL,以下测试可以很好地编译: 这是应该的。我不确定ADL是否在这里得到了利用,但无论如何,它是有意义的。根据MSDN文档,我们有: 请记住以