空向量允许推回其自身的第一个元素
empty vector allows push back first element of itself
我的一个朋友展示了一个非常简单的例子:
#include <vector>
int main()
{
vector<int> v;
v.push_back( v[0] );
return 0;
}
它编译时没有任何警告。应该在编译时检测到模板的问题。你对这种奇怪的行为有什么解释?
对我来说,这似乎是一个运行时问题,而不是编译时问题。编译器应该如何知道向量是如何运行的?
应该在编译时检测到模板实例化的问题时间,但一旦实例化,实例化的结果就会起作用与任何其他类或函数完全一样。正在检测类似的错误你所展示的一般来说是不可能的,它们会导致未定义的行为在运行时。
这种情况会触发未定义的行为-编译器不需要识别它,尽管它可以尝试识别。因此,任何事情都可能发生-编译器可能会警告您,或者这段代码可能会导致运行时问题,或者您根本看不到任何负面消息。
我认为这不是编译时的问题。在编译时,编译器不知道或关心向量是否为空。
在运行时,当您尝试访问向量的第一个元素时,我预计会发生异常。
即使在运行时,此代码的行为也是未定义的。如果您想要向量绑定误用的确定性行为(以异常的形式来标记错误),则需要使用vector::at()而不是vector::operator[]
。
相关文章:
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- C++ queue.front();为什么不从第一个元素开始呢?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- 静态堆栈函数不会 1) 输入第一个元素 2)添加新元素时识别旧元素
- 从队列中删除第一个元素C++
- 如果第一个元素包含任何零,则我的程序以不希望的方式运行
- 为什么数组不打印第一个元素?
- 在数组中显示第一个元素用户输入
- 消除集合的第一个元素
- 为什么指向矢量第一个元素的指针会丢失?
- 如何打印出常量字符串的第一个元素?
- 读取数组的第一个元素还是第 4000 个元素更快?
- 如何在数组的一部分中查找特定值的第一个元素
- 对数组进行排序的算法,先是第一个元素,然后是前 2 个元素,然后是前 3 个元素,依此类推
- 访问指向对象指针向量的指针的第一个元素?
- 引用保留向量中的第一个元素
- 指向数组的指针是否应该等于指向其第一个元素的指针?
- 尝试将参数包的第一个元素作为函数调用,并将包的其余部分作为参数传递给它
- 代码是否有效.如果我想显示第一个元素?如果不是,那么 s.begin() 会返回什么?