c – 对于原始数组和std :: vector,一个接一个结束的下标明显不
之前已经以各种形式提出过要求,但由于语言规范在这方面看起来非常有活力(或者至少在对此事进行某些SO讨论时是动态的),因此重新审视此事可能是有意义的.最近的任何发展,如果存在的话.
所以,问题是,是否和?和下标是获取指向数组的虚构的past-the-end元素的指针的有效方法 int a[42] = {}; &a[42]; 在C 98中它被认为是未定义的.但现代C呢?我们已经看到DR#232,但由于某种原因仍然处于“起草”状态,并且绝对不在标准文本中(截至C14).这件事还悬在悬空中还是通过一些替代手段解决了? 有趣的是,DR#315似乎公开允许通过空指针p(!)调用非静态成员函数,其基础是“当p为null时,* p不是错误,除非将左值转换为右值”.感觉就像DR#315的解决方案暂时基于DR#232所谓的扣篮式未来解决方案,但后者未能实现.从那个角度来看,DR#315真的是NAD吗? 此外,从C11开始,库规范将可解除引用的迭代器定义为* it表达式有效的迭代器,在std :: vector的情况下,/可能会将此事件主要委托给原始数组的上述问题,并且显然打开了门for dererenceable std :: vector :: end()迭代器.这可能使以下代码有效 std::vector<int> v(42); &v[42]; 它真的有效吗? SO上的一些较旧的答案明确指出,取消引用标准的end()迭代器总是未定义的.但在C语言的后11版本中似乎并不那么明确.该标准表示库实现“永远不会假定”终结迭代器是可解除引用的,这意味着它们不再无条件地不可解除引用. 附:我已经看过这个讨论Lvalues which do not designate objects in C++14,但它似乎专注于参考初始化的有效性,我不想带这里. 解决方法
据我所知,你在& v [42](或& a [42])表达式中取消引用它并且它是未定义的.
基于N4140:
我不认为超过数组最后一个元素的非元素被认为是一个对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |