从Cvalue的概念中,我意识到了
“隐式或显式不应进行进一步转换的表达式称为cvalue表达式。”
但是这个例子提供的例子。
s32 = static_cast < int32_t > ( s8 ) + s8; // Example 2 - Compliant
s32 = s32 + s8; // Example 3 - Compliant
显然,正确的添加表达式会在此处隐式显式转换。而这条规则将它们标记为合规。我认为这与概念cvalue相矛盾。
答案 0 :(得分:3)
在第57页末尾,MISRA Cpp 2008:
类似,除非列出如下:
。 。
其他未列出的表达式不是 cvalues ,并且具有该操作的基础类型。
在该段落之后阅读长列表,s8
无法应用任何内容。
然后,s8
不是 cvalues ,它具有操作的基础类型,在您的示例中,其基础类型为int32_t
。促销int32_t
并不违反规则。
5-0-3的重点是它希望确保所有操作都在相同的底层类型中执行。
int32_t s32;
int8_t s8;
s32 = static_cast < int32_t > ( s8 ) + s8; // Example 2 - Compliant
s32 = s32 + s8; // Example 3 - Compliant
在上述示例中,+
使用基础类型int32_t
执行(到目前为止,大多数int
为int32_t
或int16_t
) ,返回基础类型int32_t
,然后分配给int32_t
变量,从而符合MISRA Cpp。
在这个例子中:
int32_t s32;
int8_t s8;
s32 = s8 + s8;
它没有合规性,因为加法运算符的执行类型为int
,结果将转换为int32_t
,这与int
不一样,因此不遵守。