可以添加额外的const资格中断功能(假设编译顺利)?

mr_*_*r_T 19 c++ testing compilation const

当我尝试将const-correctness应用于我自己的代码时,我经常需要const在其他模块中添加资格(由其他程序员编写)以便在我自己的代码中使用这些函数.(参见补丁修正的正确性)

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

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

他有意见吗?有没有办法应用const-correctness可能破坏现有的功能?

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

Bat*_*eba 15

他们确实有一点意义.

  1. 如果const从最初的变量中删除ness const,则程序行为未定义.如果添加const资格,您可能会将其引入代码中.

  2. 您可能会无意中切换函数重载以进行函数重写.

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

  4. C++标准并没有坚持sizeof(T*) == sizeof(const T*).你的类v表布局可以在您制作非不同的const,以const参数开关.当然,这不太可能,但你必须测试.

总之,您必须测试这些更改.

  • 你在第4点被[挑战](http://stackoverflow.com/questions/33869832/could-it-be-the-case-that-sizeoft-sizeofconst-t#comment55503160_33869976). (19认同)
  • @Bathsheba"3.9.2.3.布局兼容类型的cv限定版本和cv不合格版本(3.9.3)的指针应具有相同的值表示和对齐要求(3.11)" (5认同)
  • 对于情况(3),这样的代码应该是格式错误的,而不是未定义的.VC++坏了.哪些编译器包含在"许多编译器"中? (3认同)

Jar*_*d42 12

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

class C
{
public:
    int& get() { return i; }    
    int get() const { return i; }
private:
    int i = 42;
};
Run Code Online (Sandbox Code Playgroud)

你可能有不同的行为:

C c;

auto&& p1 = c.get();
auto&& p2 = c.get();
assert(&p1 == &p2); // true
Run Code Online (Sandbox Code Playgroud)

const C c;

auto&& p1 = c.get();
auto&& p2 = c.get();
assert(&p1 == &p2); // not true.
Run Code Online (Sandbox Code Playgroud)