【发布时间】:2021-09-02 20:59:12
【问题描述】:
以下代码调用const 方法,传递对成员的引用,然后对其进行修改。
#include <iostream>
struct A {
int i;
A(int _x) : i(_x) { }
void calc(int& j, const int value) const { j = value; }
void set1() { calc(i, 1); }
};
int main()
{
A a(3);
std::cout << a.i << std::endl;
a.set1();
std::cout << a.i << std::endl;
return 0;
}
代码使用 gcc 6.4.0 和 clang 5.0.2 编译,没有警告。
代码合法吗?
当从 non-const 方法调用时,const 方法 calc 能够修改对象。
【问题讨论】:
-
除非您的对象不是
const,否则const说明符没有任何区别。如果a是const,您将无法调用A::set1。 -
在
void calc尝试i = value;。然后你会突然得到error: assignment of member ‘A::i’ in read-only object....或者尝试设置const int& j。然后你会得到error: assignment of read-only reference ‘j’ -
这是一个很好的例子,为什么您不应该将原始字段公开为可公开访问的成员。
-
@YurySchkatula 将其设为私有不会改变行为
标签: c++