c ++迭代一个项目 - UB或定义的行为?

时间:2017-01-30 09:33:04

标签: c++ language-lawyer

我最近一直在考虑c ++中指针算法的规则,他们已经知道指针算法只针对指向数组中存在的对象的指针定义。

这让我想知道根据标准是否严格地定义了以下代码的行为。

任何人都可以放弃任何光明吗?

declare namespace NodeJS {
    export var Console: {
        prototype: Console;
        new(stdout: WritableStream, stderr?: WritableStream): Console;
    }
...

declare module "buffer" {
    export var INSPECT_MAX_BYTES: number;
    var BuffType: typeof Buffer;
    var SlowBuffType: typeof SlowBuffer;
    export { BuffType as Buffer, SlowBuffType as SlowBuffer };
}

4 个答案:

答案 0 :(得分:4)

根据5.7 [expr.add]第4段,指向对象的指针就像指针一个元素数组的第一个对象:

  

出于这些运算符的目的,指向非阵列对象的指针与指向长度为1的数组的第一个元素的指针的行为相同,其中对象的类型为其元素类型。

答案 1 :(得分:3)

这是良好的形式。

[expr.add] / 4表示:

  

出于这些运算符的目的,指向非阵列对象的指针的行为与指向长度为1的数组的第一个元素的指针的行为相同,其中对象的类型为其元素类型。

之后声明([expr.add] / 5):

  

如果指针操作数和结果都指向同一个数组对象的元素,或一个过去   数组对象的最后一个元素,评估不应产生溢出;否则,行为是   未定义。

强调我的。

答案 2 :(得分:3)

正如提到的其他答案,您的计划是完善的。以下是最新工作文件中的相关标准:

  

§5.7 (footnote 86) [expr.add]

     
    

为此目的,不是数组元素的对象被认为属于单元素数组;见[expr.unary.op]。超过n元素的数组x[n]的最后一个元素的指针被认为等同于为此目的指向假设元素function SetFormMsg($msg) { if(!isset($_SESSION)){ session_start(); } $_SESSION['formMsg'] = $msg; } function ViewFormMsg() { if(!isset($_SESSION)){ session_start(); } if(isset($_SESSION['formMsg']) { $message = $_SESSION['formMsg']; } else { $message = ""; } return $message } 的指针;见[basic.compound]

  

简而言之,非数组对象在指针算术的上下文中表现得像单个元素数组。因此,采用一个过去的地址是合法的。

答案 3 :(得分:2)

该计划格式正确。

您可以将指针设置为超出数组末尾,或者甚至超出标量地址的范围,就好像它是单个元素数组一样。

第二部分在这里很重要。只要您实际上取消引用 gradle buildlast_thing不会,您的代码就会完美运行。