空向量允许推回自身的第一个元素

时间:2011-06-24 09:12:42

标签: c++

我的一位朋友展示了一个非常简单的例子:

#include <vector>

int main()
{
    vector<int> v;
    v.push_back( v[0] );

    return 0;
}

它编译,没有任何警告。应在编译时检测模板问题。你对这种奇怪的行为有什么解释?

5 个答案:

答案 0 :(得分:2)

这似乎是一个运行时问题,而不是编译时问题。如何编译器知道向量如何运行?

答案 1 :(得分:2)

应该在编译时检测模板实例化的问题 时间,但一旦实例化,实例化的结果就表现出来了 与任何其他类或功能完全一样。检测像这样的错误 你表明一般是不可能的,它们会导致不确定的行为 在运行时。

答案 2 :(得分:2)

这种情况触发了未定义的行为 - 编译器不需要识别它,尽管它可以尝试。因此,任何事情都可能发生 - 编译器可能会警告您,或者此代码可能会导致运行时问题,或者您根本不会发现任何负面情况。

答案 3 :(得分:0)

我想说这不是编译时的问题。在编译时,编译器不知道,或者关心向量是空的。

在运行时,我会期望在您尝试访问向量的第一个元素时发生异常。

答案 4 :(得分:0)

即使在运行时,此代码的行为也未定义。如果您想要在向量绑定误用时使用确定性行为(以标记错误的异常形式),则需要使用vector::at()而不是vector::operator[]