以前已经以各种形式提出过这个问题,但是由于语言规范在这方面似乎相当动态(或者至少was当对此问题进行一些 SO 讨论时是动态的),根据最近的事态发展(如果存在)重新审视该问题可能是有意义的。
所以,问题又是,是否将&
下标是获取指向数组中虚构的末尾元素的指针的有效方法
int a[42] = {};
&a[42];
在 C++98 中它被认为是未定义的。但现代 C++ 又如何呢?我们已经看到DR#232 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232,但由于某种原因仍处于“起草”状态,并且绝对不在标准文本中(从 C++14 开始)。此事是否仍然悬而未决,还是已经通过其他方式解决了?
有趣的是DR#315 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#315似乎公开允许通过空指针调用非静态成员函数p
(!)基于“*p
当p
除非左值转换为右值,否则为空”。感觉 DR#315 的决议暂时基于 DR#232 所谓的灌篮未来决议,但后者未能实现。从这个角度来看,DR#315 是第315章 真的是NAD吗?
此外,从 C++11 开始,库规范定义了可解引用的迭代器简单地作为迭代器*it
表达式是有效的,在以下情况下std::vector
会/可能在很大程度上将问题委托给原始数组的上述问题,并且显然为可鄙的行为打开了大门std::vector::end()
迭代器。这可能使以下代码有效
std::vector<int> v(42);
&v[42];
它真的有效吗? SO 的一些较旧的答案明确指出取消引用标准end()
迭代器始终是未定义的。但在 C++11 之后的语言版本中,它似乎并不那么明确。该标准表示,库实现“从不假设”最终迭代器是可解引用的,这意味着它们不再是无条件不可解引用的。
附:我已经看过这个讨论C++14 中不指定对象的左值 https://stackoverflow.com/questions/26290598/lvalues-which-do-not-designate-objects-in-c14,但它似乎特别关注引用初始化的有效性,我不想在这里提到它。
据我所知,您正在取消引用它&v[42]
(or &a[42]
) 表达式并且它是未定义的。
基于N4140:
[expr.unary.op]/1
一元 * 运算符执行间接寻址:
应用它的表达式应是指向对象的指针
类型,或指向函数类型的指针和结果是一个左值
指的是对象或表达式指向的函数。
我不认为数组最后一个元素之后的非元素被视为对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)