我的一位朋友展示了一个非常简单的例子:
#include <vector>
int main()
{
vector<int> v;
v.push_back( v[0] );
return 0;
}
它编译,没有任何警告。应在编译时检测模板问题。你对这种奇怪的行为有什么解释?
答案 0 :(得分:2)
这似乎是一个运行时问题,而不是编译时问题。如何编译器知道向量如何运行?
答案 1 :(得分:2)
应该在编译时检测模板实例化的问题 时间,但一旦实例化,实例化的结果就表现出来了 与任何其他类或功能完全一样。检测像这样的错误 你表明一般是不可能的,它们会导致不确定的行为 在运行时。
答案 2 :(得分:2)
这种情况触发了未定义的行为 - 编译器不需要识别它,尽管它可以尝试。因此,任何事情都可能发生 - 编译器可能会警告您,或者此代码可能会导致运行时问题,或者您根本不会发现任何负面情况。
答案 3 :(得分:0)
我想说这不是编译时的问题。在编译时,编译器不知道,或者关心向量是空的。
在运行时,我会期望在您尝试访问向量的第一个元素时发生异常。
答案 4 :(得分:0)
即使在运行时,此代码的行为也未定义。如果您想要在向量绑定误用时使用确定性行为(以标记错误的异常形式),则需要使用vector::at()而不是vector::operator[]
。