规则7-1-1(必需)未修改的变量应为const限定
如果不需要修改变量,那么它应该是 用const限定声明,以便它不能被修改。一个 然后,非参数变量将需要在其初始化 宣言点。此外,未来的维护也不会意外 修改价值。
void b ( int32_t * ); int32_t f ( int32_t * p1, // Non-compliant int32_t * const p2, // Compliant int32_t * const p3 ) // Compliant { *p1 = 10; *p2 = 10; b( p3 ); int32_t i = 0; // Non-compliant return i; }
标准中包含的示例主要关注指针。该规则要求符合条件的所有指针都是const
,例如int * const
。如果我理解正确,不需要指针和引用指向const
个对象,例如const int *
或const int &
。事实上,它被另一个规则所覆盖(但仅限于参数!):
规则7-1-2(必需)如果未修改相应的对象,则函数中的指针或引用参数应声明为const的指针或const的引用
那么,规则7-1-1是否适用于参考文献?引用在创建后无法重新绑定,因此应将其视为const
指针。因此,所有引用都应自动符合规则7-1-1。
编辑(基于Lightness Races in Orbit,Richard Critten& Peter和我的实验的评论:或规则是否正确在引用的情况下适用于引用对象的类型?我的意思是const int &
与int &
类似于const int
与int
?
我问,因为我的MISRA C ++检查程序不断报告引用的违规行为......其行为示例:
class A
{
int property;
public:
A(int param) : property(param) {} // violation: should be: const int param
int get_property() const { return property; }
void set_property(int param) { property = param; } // violation: should be: const int param
};
class ConstA
{
const int property;
public:
ConstA(int param) : property(param) {} // violation: should be: const int param
int get_property() const { return property; }
// setter not allowed
};
void example1()
{
const A const_obj_A(1);
A nonconst_obj_A(2);
ConstA nonconst_obj_constA(3); // OK: used to create a non-const reference
const A& const_ref_A = nonconst_obj_A;
A& nonconst_ref_A = nonconst_obj_A; // OK: setter called
nonconst_ref_A.set_property(4);
ConstA& const_ref_constA = nonconst_obj_constA; // violation: no modification
// In fact, it seems to be impossible to make
// a non-violating ConstA& declaration.
// The only chance is to make another non-const reference
// but the last declaration in the chain will still violate.
}
void example2()
{
const A const_obj_A(1);
A nonconst_obj_A(2);
ConstA nonconst_obj_constA(3); // violation: used only in const reference
const A& const_ref_A = nonconst_obj_A;
A& nonconst_ref_A = nonconst_obj_A; // violation: no modification using the ref.
const ConstA& const_ref_constA = nonconst_obj_constA;
}
答案 0 :(得分:5)
不,7-1-1不适用于参考文献。
int32_t & const p2
形式的声明是无稽之谈。
请求的唯一有意义的const
限定格式为const int32_t &p2
或等效int32_t const &p2
。然后需要将这些表格完全覆盖在7-1-2中。
Misra 7-1-1不需要应用于此类引用,因为Misra的原理是指定语言标准不具有的约束,不重述已在语言中指定的约束(并由编译器强制执行)。 Misra 7-1-1要求变量(例如类型为int32_t
)如果不被修改则声明为const
- 例如引用示例中的i
。在标准C ++中,不可能创建对该变量的非const
引用 - 除非使用类型转换(也称为“强制转换”)来删除const
。米苏拉规则5-2-5要求不得使用此类演员。
答案 1 :(得分:1)
C ++指针和引用之间存在显着的语义差异:引用不是对象(变量)。
它只是对象别名。因此,严格的形式意义7-1-1不适用于参考文献。