簡體   English   中英

const指向const數據和c ++列表的指針

[英]const pointer to const data and c++ lists

我想在列表中插入一些元素。
我真正想要做的是使用“insert3”,因為它保證指針不會改變,數據不會改變。
但是“insert2”和“insert3”會出現以下錯誤,“insert1”不會:

class A
{
public:
    std::list<int*> l;
    void insert(int* const a)
    {
        l.push_back(a); //works
    }

    void insert2(const int* a)
    {
        l.push_back(a);
        /*
        no instance of overloaded function "std::list<_Ty, _Ax>::push_back [with _Ty=int *, _Ax=std::allocator<int *>]"
            matches the argument list
        */
    }

    void insert3(const int* const a)
    {
        l.push_back(a);
    }

};

謝謝你的幫助!

簡短的回答

您應該使用list<int const* const>作為l的類型,然后您可以使用任何插入包括insert3

答案很長

通過插入list<int*>您嘗試將int const* (指向const int的指針)轉換為int* (指向int的指針)。

由於您要刪除不會編輯指針目標的保證,因此這不是隱式可行的。 如果你真的希望這樣做,你可以使用const_cast (或c-cast),但通常拋棄const -ness是一個非常糟糕的主意(tm)。

為什么使指針本身為const不會改變一個東西

如果你使用int const* const (const指向const int)使用版本3,那么你得到的任何東西都不會保證在insert3運行時變量a不會被改變。 通過將指針插入列表,您實際上正在復制它。 這意味着無論a是否為const ,結果列表項都將是您在開頭指定的類型。

通過將列表放入list<int const* const>可以確保以后不能更改任何插入的指針,並且只有在顯式刪除指針的const后才能更改指向它的值。 插入它是可能的,因為總是可以隱式地添加const

更改list以獲取指向const的指針:

std::list<const int*> l;

由於您有一個指向const的參數指針,因此不允許通過隱式轉換取消其const -ness。

它是C ++風格的編譯時const-correctness類型系統的典型高級“問題”之一。

如果你想在列表中存儲int *指針,那么你將無法將const int *指針添加到該列表中(原因很明顯)。 這將強制所有insert方法接受int *指針,而不是const int *指針。

我明白,你真正想要表達的是insert方法本身不會改變指向的數據(而且它沒有)。 但是,正如您所看到的, insert具有一些影響深遠的副作用 - 它將指針存儲在列表中。 如果insert接受const int *指針,這可能會違反const-correctenss。

換句話說,這是不夠的,考慮什么insert由自己做,這也是很重要的考慮什么准備insert打開其他代碼(在這種情況下-到具有訪問同一列表中的其他代碼)。 在你的情況下,如果你的insert安靜地接受const int *指針,那么它打開的可能性很容易讓其他代碼中出現const-correcness違規。

當然,在這種情況下,你可以通過使用強制const_cast來強加你自己對正確的const正確性的看法。 但它看起來不會很漂亮。

暫無
暫無

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

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