从Cvalue的概念来看,我意识到
“不应进行进一步转换的表达式,无论是隐式的还是显式的,都称为cvalue表达式。”
但是用这个规则给出的例子。
s32 = static_cast < int32_t > ( s8 ) + s8; // Example 2 - Compliant
s32 = s32 + s8; // Example 3 - Compliant
显然,正确的加法表达式在这里隐式和显式转换。这条规则表明他们是顺从的。我认为这与cvalue的概念相冲突。
发布于 2016-12-21 07:17:44
在第57页末尾,MISRA Cpp 2008:
类似情况,除非如下所列:
阅读该段之后的长列表,没有任何东西可以应用于s8
。
然后,s8
不是cvalue,它具有操作的基础类型,在您的示例中,它的底层类型是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。
在本例中:
int32_t s32;
int8_t s8;
s32 = s8 + s8;
由于加法操作符是用int
类型执行的,所以它不符合要求,结果将转换为int32_t
,这与int
不一样,因此不符合要求。
https://stackoverflow.com/questions/41256292
复制相似问题