尾后一位下标的明显不足:对于原始数组和 std::vector 来说。已经果断解决了吗?

2024-01-09

以前已经以各种形式提出过这个问题,但是由于语言规范在这方面似乎相当动态(或者至少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(!)基于“*pp除非左值转换为右值,否则为空”。感觉 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(使用前将#替换为@)

尾后一位下标的明显不足:对于原始数组和 std::vector 来说。已经果断解决了吗? 的相关文章

  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • 带有运算符语法的错误消息,但不带有函数语法的错误消息

    为什么我在调用 unary 时收到错误消息 使用运算符语法 如果我用函数语法调用它就可以了 现场演示 https godbolt org z j7AbeQ template
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • 为什么不能调用带有 auto& 参数的 const mutable lambda?

    include
  • 将文本拆分为数组,同时保留 Swift 中的标点符号

    我想将文本拆分为一个数组 保持标点符号与其余单词分隔开 因此字符串如下 Hello I am Albert Einstein 应该变成这样的数组 Hello I am Albert Einstein 我尝试过sting components
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的

随机推荐