簡體   English   中英

在const函數中返回對self的間接引用

[英]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.ptrconst ,但是指向的對象不是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 * 一個更簡單的解決方案是在這里實際上擁有兩個不同的類(例如aconst_a )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM