我已经得到了以下这段代码,
#include <iostream>
#include <string>
using namespace std;
class Foo {
public:
void print() { cout << "hello\n"; }
}
;
Foo get_foo() {
Foo f;
return f;
}
int main()
{
// If I get rid of this "const", then the error goes away
const Foo f = get_foo();
f.print();
return 0;
}
当我编译它时,它给了我这个错误
test.cc:21:11: error: passing ‘const Foo’ as ‘this’ argument discards qualifiers [-fpermissive]
f.print();
我尝试删除&#34; const&#34;在f的声明中,代码将被编译。
但我不明白这个限制。 有人可以解释一下吗? 我怎么称呼&#34; print()&#34;没有删除&#34; const&#34;来自该领域的宣言?
编辑:&#34; Foo&#34;上面添加的课程纯粹是出于演示目的。在我的真实代码中,我无法编辑课程,但我想制作的原因是&#34; f&#34; const是出于代码风格/安全原因。
答案 0 :(得分:2)
&#34; Foo&#34;上面添加的课程纯粹是出于演示目的。在我的真实代码中,我无法编辑课程,但我想制作的原因是&#34; f&#34; const是出于代码风格/安全原因。
自
void print() { cout << "hello\n"; }
并未声明为const
的{{1}}成员函数,而您无法改变这一点,您将不得不吞下那个糟糕的设计,并访问{{ 1}}通过非Foo
实例或引用来运行。
要做到这一点,需要在print()
类中声明const
,如
print()
我同意更好的代码样式是允许使用Foo
void print() const { cout << "hello\n"; }
// ^^^^^
print()
实例调用const
函数。
但正如你所提到的,如果你无法改变,那么除了使用明确的演员之外别无他法:
Foo
无论如何,除了简单的电话之外,还没有额外的&#34;安全&#34; :
const_cast<Foo&>(f).print();