[英]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.