加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 对于原始数组和std :: vector,一个接一个结束的下标明显不

发布时间:2020-12-16 06:52:34 所属栏目:百科 来源:网络整理
导读:之前已经以各种形式提出过要求,但由于语言规范在这方面看起来非常有活力(或者至少在对此事进行某些SO讨论时是动态的),因此重新审视此事可能是有意义的.最近的任何发展,如果存在的话. 所以,问题是,是否和?和下标是获取指向数组的虚构的past-the-end元素的指
之前已经以各种形式提出过要求,但由于语言规范在这方面看起来非常有活力(或者至少在对此事进行某些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:

[expr.unary.op]/1

The unary * operator performs indirection : the
expression to which it is applied shall be a pointer to an object
type,or a pointer to a function type and the result is an lvalue
referring to the object or function to which the expression points.

我不认为超过数组最后一个元素的非元素被认为是一个对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读