可以添加额外的const限定来破坏功能(假设编译顺利)
Can adding extra const qualifications break functionality (assuming compilation went fine)?
当我试图为自己的代码应用常量正确性时,我经常不得不在其他模块(由其他程序员编写)中的函数定义中添加const
资格,以便在自己的代码中使用这些函数。(请参阅此处的背面补丁常量正确性)
我一直认为,如果一切都编译得很好,这可能会导致功能崩溃,因为const
标签只在编译时才重要。
然而,有一天,我的一位同事坚持认为,在提交添加了const
标签的代码之前,我应该重新运行所有自动化测试,我认为编译这样的代码就足够了。
他有道理吗?有没有一种方法可以应用常量正确性来破坏现有的功能?
编辑:可能需要注意的是,通常情况下,我只需要对函数的指针参数(例如Something getSomething(Object* pObj)
到Something getSomething(const Object* pObj)
)执行此操作。我不会更改返回类型或方法常量,因为这对客户端代码来说不是问题。
它们确实有道理。
-
如果从最初为
const
的变量中去掉const
-ness,则程序行为是未定义的。如果您添加const
资格,您就有可能将其引入代码中。 -
您可能无意中将重载的函数切换为覆盖。
-
将匿名临时传递给接受
const
引用的函数是定义的,但如果该函数接受非const
引用,则行为是未定义的。许多编译器允许使用非const
(可能是意外的,尽管有些编译器甚至将其称为扩展)。表面上看,你是在帮每个人解决这个问题,但你可能是在删除运行时依赖的未定义行为构造。 -
C++标准没有坚持
sizeof(T*) == sizeof(const T*)
。在进行非const
到const
参数切换时,类的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.
是
添加const
s的一个可能的问题是,以后更改变量时可能会出现未定义的行为(在编译器无法阻止的情况下)
如果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
}
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 功能原型的目的
- 可以添加额外的const限定来破坏功能(假设编译顺利)