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
他们确实有一点意义.
如果const从最初的变量中删除ness const,则程序行为未定义.如果添加const资格,您可能会将其引入代码中.
您可能会无意中切换函数重载以进行函数重写.
将匿名临时值传递给接受const 引用的函数,但如果函数采用非const引用,则行为未定义.许多编译器允许非const(可能是偶然的,尽管有些甚至称为扩展).表面上看,你正在帮助每个人解决这个问题,但你可能正在删除一个在运行时依赖的未定义行为结构.
C++标准并没有坚持sizeof(T*) == sizeof(const T*).你的类v表布局可以在您制作非不同的const,以const参数开关.当然,这不太可能,但你必须测试.
总之,您必须测试这些更改.
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)