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

empty vector allows push back first element of itself

本文关键字:第一个 元素 向量 许推回      更新时间:2023-10-16

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

#include <vector>
int main()
{
    vector<int> v;
    v.push_back( v[0] );
    return 0;
}

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

对我来说,这似乎是一个运行时问题,而不是编译时问题。编译器应该如何知道向量是如何运行的?

应该在编译时检测到模板实例化的问题时间,但一旦实例化,实例化的结果就会起作用与任何其他类或函数完全一样。正在检测类似的错误你所展示的一般来说是不可能的,它们会导致未定义的行为在运行时。

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

我认为这不是编译时的问题。在编译时,编译器不知道或关心向量是否为空。

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

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