[英]Returning indirect reference to self in const function
我正在學習鄙視const
。
struct b;
struct a {
b* p;
void nonConst() { p = nullptr;}
b* getP() const { return p;}
};
struct b {
a *p;
a *getP() const { return p;}
};
void func (const a *ii) {
b *uRef = ii->getP();
//dear god, we've just obtained a pointer to a non-const a, starting with const a
a *iii = uRef->getP();
//and we've just modified ii, a const object
iii->nonConst();
}
int main() {
a *i = new a;
b *u = new b;
i->p = u;
u->p = i;
func(i);
}
這會引起任何不確定的行為嗎? 如果不是,是否違反了任何const
規則? 如果不是這樣,為什么將this
視為指向const
數據的const
指針,而不僅僅是指向非const
數據的const
指針?
您的代碼中沒有const
變量,因此沒有UB。
在void func (const a *ii)
該const
是指ii
可能或者被指向到a
或一個const a
,所以我們不應該允許通過該指針的情況下,它實際上指向一個寫const a
。
但是在您的代碼中,它實際上並不指向const a
。
您似乎遇到的潛在問題與基本結構有關:
struct C
{
std::string *ptr;
};
在這種情況下,如果我們有一個變量:
const C c = something;
那么問題是,是否應該允許寫:
*(c.ptr) = "Hello";
C ++的規則說“是的,這很好”。 這是因為c.ptr
是const
,但是指向的對象不是const
。
這個問題是否真的是一個好主意,是您必須在類接口中決定的一個問題(將在類的文檔中進行描述)。
如果該字符串的值對於C
實例應該是不變的,則您可能希望不允許這樣做,或者至少不鼓勵這樣做。
回到您的原始代碼,如果要讓const a
表示持有const b
,則需要輸入:
b const * getP() const { return p;}
^^^^^
然后調用者將無法編寫b *uRef = ii->getP();
,他們至少必須拋出const_cast
。
最后,沒有簡單的方法讓const a
實際持有b const *
,但有一個非const a
持有b *
。 一個更簡單的解決方案是在這里實際上擁有兩個不同的類(例如a
和const_a
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.