【发布时间】:2021-10-18 14:45:42
【问题描述】:
我有以下测试代码:
class A
{
public:
void funcA()
{
std::cout << "banana" << std::endl;
}
};
class B
: public A
{
public:
A t;
void funcB() const
{
t.funcA();
}
};
int main(int argCount, char *args[])
{
B tst;
tst.funcB();
}
其中funcA 没有const定义,而funcB 有const 定义。
编译代码时出现错误:
passing ‘const A’ as ‘this’ argument discards qualifiers [-fpermissive]
这应该发生,因为我在 const 函数内部调用了 non-const 函数。
但是,当我这样做时:
class B
: public A
{
public:
A* t;
void funcB() const
{
t->funcA();
}
};
代码编译并工作。这是为什么?我只是用g++ -g main.cpp 编译,我缺少这个标志?还是这种行为是意料之中的?
【问题讨论】:
-
你想要
const A *t而不是A *t。请记住,您正在修改t指向的对象,而不是t本身,因此编译器认为这很好。 -
为什么你有
A作为B的基类和 作为B的成员?您根本没有使用基类,因此可以将其从 sn-ps 中删除(以减少混淆)并仅保留成员t。第一个 sn-p 不会编译,因为t(嵌入在B实例中的A的实际实例)是const,就像this指向的周围的B实例一样在。在第二个 sn-p 中,t指向A的非const实例(即使指针t本身是const),您可以(当然)在其上调用任意非-const方法。 -
t本身就是const,而不是t指向的对象。 -
std::experimental::propagate_const 可能有预期的行为。