我试图const更深入地理解c ++的语义,但我无法完全理解constness保证值得的是什么.正如我所看到的,constness保证不会有变异,但请考虑以下(人为的)示例:
#include <iostream>
#include <optional>
#include <memory>
class A {
public:
int i{0};
void foo() {
i = 42;
};
};
class B {
public:
A *a1;
A a2;
B() {
a1 = &a2;
}
void bar() const {
a1->foo();
}
};
int main() {
B b;
std::cout << b.a2.i << std::endl; // output is 0
b.bar();
std::cout << b.a2.i << std::endl; // output is 42
}
Run Code Online (Sandbox Code Playgroud)
因为bar就是const,人们会认为它不会发生变异对象b.但是在它的调用b发生变异之后.如果我写的方法foo是这样
void bar() const {
a2.foo();
}
Run Code Online (Sandbox Code Playgroud)
然后编译器按预期捕获它.因此,似乎可以相当容易地用指针绕过编译器.我想我的主要问题是,如何或者我是否可以100%确定const方法不会对它们被调用的对象造成任何突变?或者我对此有完全错误的期望const?
为什么c ++允许在const方法中的指针上调用非const 方法?
编辑:
感谢Galik的评论,我现在发现了这个:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4372.html
嗯,这正是我想要的!谢谢!我发现Yakk的回答也非常有用,所以我会接受他的回答.
const 告诉调用者"这不应该改变对象".
const 帮助实现者出现一些错误,其中意外变异状态会产生错误,除非实现者将其丢弃.
const数据(不是引用,实际数据)为编译器提供保证,修改此数据的任何人都在做未定义的行为; 因此,编译器可以自由地假设数据永远不会被修改.
const在std库中对线程安全做出了一定的保证.
所有这些都是使用const.
如果一个对象是不是const,任何人都可以自由地const_cast离开const到对象的引用,并对其进行修改.
如果一个对象是const,编译器将无法可靠地诊断您丢弃const,并生成未定义的行为.
如果您将数据标记为mutable,即使它也被标记为const不会.
std基于提供的保证const受到您std遵循这些保证的类型的限制.
const不会对程序员强制执行.它只是试图帮助.
没有语言可以使hostlie程序员友好; const在C++中不尝试.相反,它试图使编写正确的代码比编写不正确的代码更容易.constconst
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |