可以添加额外的const限定来破坏功能(假设编译顺利)

Can adding extra const qualifications break functionality (assuming compilation went fine)?

本文关键字:功能 假设 编译 添加 const      更新时间:2023-10-16

当我试图为自己的代码应用常量正确性时,我经常不得不在其他模块(由其他程序员编写)中的函数定义中添加const资格,以便在自己的代码中使用这些函数。(请参阅此处的背面补丁常量正确性)

我一直认为,如果一切都编译得很好,这可能会导致功能崩溃,因为const标签只在编译时才重要。

然而,有一天,我的一位同事坚持认为,在提交添加了const标签的代码之前,我应该重新运行所有自动化测试,我认为编译这样的代码就足够了。

他有道理吗?有没有一种方法可以应用常量正确性来破坏现有的功能?

编辑:可能需要注意的是,通常情况下,我只需要对函数的指针参数(例如Something getSomething(Object* pObj)Something getSomething(const Object* pObj))执行此操作。我不会更改返回类型或方法常量,因为这对客户端代码来说不是问题。

它们确实有道理。

  1. 如果从最初为const的变量中去掉const-ness,则程序行为是未定义的。如果您添加const资格,您就有可能将其引入代码中。

  2. 您可能无意中将重载的函数切换为覆盖。

  3. 将匿名临时传递给接受const引用的函数是定义的,但如果该函数接受非const引用,则行为是未定义的。许多编译器允许使用非const(可能是意外的,尽管有些编译器甚至将其称为扩展)。表面上看,你是在帮每个人解决这个问题,但你可能是在删除运行时依赖的未定义行为构造。

  4. C++标准没有坚持sizeof(T*) == sizeof(const T*)。在进行非constconst参数切换时,类的v-table布局可能会不同。当然,这不太可能,但您必须进行测试。

总之,必须测试这些更改。

As const方法可能与非const方法不同

class C
{
public:
    int& get() { return i; }    
    int get() const { return i; }
private:
    int i = 42;
};

你可能有不同的bahavior:

C c;
auto&& p1 = c.get();
auto&& p2 = c.get();
assert(&p1 == &p2); // true

const C c;
auto&& p1 = c.get();
auto&& p2 = c.get();
assert(&p1 == &p2); // not true.


添加consts的一个可能的问题是,以后更改变量时可能会出现未定义的行为(在编译器无法阻止的情况下)
如果f是const呢?

float f = 1.0;
//do something with f
readFromBinaryFile((char *)(&f), sizeof(f));
//do another something with f
//...
void readFromBinaryFile(char *c, size_t s)
{
    //... fill c
}