为什么我允许我为std :: vector设置end()
Why am I allowed to set end() for std::vector?
在end()
的标准库实现中,除了能够检索它之外,我还可以设置过去的值。为什么允许这?这可能不会导致问题吗?
#include <vector>
#include <iostream>
int main(void)
{
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
*v.end() = 2; // why am I allowed to do this?
std::cout << *v.end() << std::endl;
return 0;
}
为什么允许这样做?
不是。您正在调用未定义的行为。此代码可以做任何事情,包括崩溃和打印2。
您不允许这样做。仅仅因为您的程序并不崩溃并不意味着它是允许的。也许当您向老板展示时,您的程序将在星期二崩溃。也许您写了2个变量。
这被称为不确定的行为,这意味着您无法期望任何特别的事情发生 - 您甚至无法期望崩溃。
这将肯定会导致问题,并且不允许标准(未定义的行为(。不幸的是,不可能编写一份编译器,以诊断所有可能违反标准的违规行为,因此,即使就标准而言,某些代码构造也是非法的。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 为什么我允许我为std :: vector设置end()
- 如何为std::vector设置有效的.begin()和.end()而不使用.resize()