C++ 为什么这段代码在VisualStudio下会出现“纯虚拟函数调用”错误

C++ 为什么这段代码在VisualStudio下会出现“纯虚拟函数调用”错误,c++,C++,以下代码在g++5.1上运行良好,但在Visual Studio 2013或2015下运行时,在main中调用Test.GetCollection时会发生R6025纯虚拟函数调用错误 但是,只有当类MoveNextCollection中的虚拟析构函数存在时,才会发生这种情况。否则,当析构函数被注释掉时,它可以正常运行。请注意,上面的错误发生在VisualStudio的桌面版本中,但如果您在该版本中运行代码,它只会显示错误-1073740791,而我假设是相同的错误。请注意,为了这篇文章的缘故,代

以下代码在g++5.1上运行良好,但在Visual Studio 2013或2015下运行时,在main中调用Test.GetCollection时会发生R6025纯虚拟函数调用错误


但是,只有当类MoveNextCollection中的虚拟析构函数存在时,才会发生这种情况。否则,当析构函数被注释掉时,它可以正常运行。请注意,上面的错误发生在VisualStudio的桌面版本中,但如果您在该版本中运行代码,它只会显示错误-1073740791,而我假设是相同的错误。请注意,为了这篇文章的缘故,代码已经精简到了最基本的部分。对不起,不能再精简了。这是VS错误吗?如有任何反馈,将不胜感激。谢谢。

基于范围的表达式:

for (int val : Test().GetCollection())
相当于:

{
    auto&& __range = Test().GetCollection();  // (1)
    for ( auto __begin = begin(__range),      // (2)
          __end = end(__range);
          __begin != __end;
          ++__begin )
    {
        int val = *__begin;
        // etc
    }
}
GetCollection返回对Test::collection的引用,但该测试对象在第1行中的表达式末尾超出了范围-因此剩下2个悬空引用。之后的一切都是未定义的行为。这只是未定义行为的一种可能结果

如果GetCollection看起来像:

Collection GetCollection() const
^^^^^^^^^^^ by value

临时绑定到引用的生存期将在引用的生存期内得到延长,这将是表达式的整个范围。在该场景中没有未定义的行为

不要在这里发布代码链接,而是将关键代码粘贴到您的问题中。从代码中剥离不相关部分的过程要么给你一个复制有趣观察结果的最小示例,要么很可能让你自己找到解决方案。如果这是标准策略,那么下次就没有发布链接了。谢谢顺便说一句,为了产生这个问题,代码被精简为一个最小的人为示例。@MikeR不,这远远不是一个好问题!我不同意。代码实际上并没有那么长,虽然可能还有一些改进的余地,但这是一个定制的集合类,正在基于范围的for循环中迭代。我不清楚到底是什么导致了这个问题,我发布的内容是使它运行并在IMHO中进行诊断所必需的最低限度。对C++ BTI来说,我不是新手。我很有经验,但我刚刚从一个长时间的间隙中回来,但有一点生锈,但一旦巴里开导我,我立刻意识到了这个问题。
Collection GetCollection() const
^^^^^^^^^^^ by value