当比较Ada Scalar类型和子类型时,我需要进行范围检查吗?

Jer*_*unh 3 types exception ada

将Ada Scalar类型与受约束的子类型进行比较时,是否需要进行范围检查?

我知道在从基类型赋值给受约束的子类型时,如果我不确保该值在赋值之前在范围内,那么我在运行时会遇到Range_Check异常的风险.

但是在进行比较时这也是正确的吗?我认为,由于用户想要的唯一知识是布尔结果,因此不需要隐式转换为基本类型或范围检查.

请注意:我正在寻找引用Ada95 LRM的答案.

declare
  type Day_Type is (SUN, MON, TUE, WED, THU, FRI, SAT);
  subtype Workday_Type is MON .. FRI; 

  Payday : constant Workday_Type := FRI;

    ...

  function Is_Payday (Day : Day_Type) 
      return Boolean is
  begin  
      return (Day = Payday);
  end Is_Payday;

begin

    -- Will this raise a RANGE_CHECK error in Is_Payday()?
    if Is_Payday(Day => SAT) then 
       ...
    elsif Is_Payday(Day => FRI) then
       ...       
    end if;

end;
Run Code Online (Sandbox Code Playgroud)

我到目前为止所发现的......

我还没有找到完整的答案.但我确实找到了几个有趣的数据.

离散类型的操作/第3.5.5章第12节它说:

(31)对于离散类型的子类型,属性Val传递的结果可能不属于子类型; 类似地,属性Pos的实际参数不必属于子类型.这些属性满足以下关系(在没有例外的情况下):

S'Val(S'Pos(X)) = X
S'Pos(S'Val(N)) = N
Run Code Online (Sandbox Code Playgroud)

(20)除了显式的type_conversions之外,类型转换是在构造的预期类型和实际类型不同的情况下隐式执行的,如类型解析规则所允许的那样(见8.6).例如,整数文字的类型为universal_integer,并在分配给某个特定整数类型的目标时进行隐式转换.类似地,当相应的形式参数是类范围类型时,隐式转换特定标记类型的实际参数.

即使预期和实际类型相同,也会执行隐式子类型转换以调整操作数的数组边界(如果有)以匹配所需的目标子类型,或者如果(可能已调整的)值不满足,则引发Constraint_Error目标子类型的约束.

这似乎表明隐式类型转换将始终执行到子类型(我很难阅读该语言).但我没有看到任何声明在所需的子类型和基类型之间进行比较的地方.

我也对声明感到困惑:

执行隐式子类型转换以调整操作数的数组边界(如果有)以匹配所需的目标子类型

  1. Array Bounds是否引用数组类型?或者是否引用了受约束子类型的范围?
  2. 是否有一个目标亚型如果没有亚型?

Ada 95理由......


我可能在搜索中错过了答案.但我正在寻找这种或那种方式的明确证据.

很抱歉长时间阅读.

Sim*_*ght 7

您可能会发现Annotated ARM版本(AARM95 3.2)很有用(请注意,您的参考资料是未维护的AdaHome网站;更喜欢http://www.adaic.org).

子类型具有类型和可能的约束:

type T is ...;
subtype S1 is T;            -- effectively a renaming of T
subtype S2 is T range ...;  -- (added) constraints
Run Code Online (Sandbox Code Playgroud)

并且子类型的操作是其类型的操作,这就是为什么你可以在Day = Payday没有转换的情况下编写比较.我们知道a Workday_Type是a Day_Type,所以我们可以直接进行比较.

确实Workday_Type (Day) = Payday存在CE的风险,但是您或编译器不需要这样做.