[英]Const correctness in generic functions using iterators
我想編寫一個接受序列的通用函數,同時保證不改變所述序列。
template<typename ConstInputIter, typename OutputIter>
OutputIter f(ConstInputIter begin, ConstInputIter end, OutputIter out)
{
InputIter iter = begin;
do
{
*out++ = some_operation(*iter);
}while(iter!=end);
return out;
}
然而,上面的示例仍然可以將任何類型作為ConstInputIterator
,而不僅僅是const
類型。 到目前為止,在其中成為const
的概念是名義上的。
我如何聲明這個 function 不會改變給定的序列?
即使在 C++20 中,也沒有通用方法將非const
T
上的迭代器強制轉換為T const
上的迭代器。 特定的迭代器可能具有執行此操作的機制,您可以使用std::cbegin/cend
獲取范圍以獲取 const 迭代器。 但是只給定一個迭代器,您將受制於用戶提供的內容。
應用 C++20 約束(要求iter_value_t
為const
)是錯誤的,因為您的 function 應該能夠在非const
范圍內運行。
由於c++17 ,您可以在每次尊重迭代器時使用std::as_const
:
// ...
*out++ = some_operation(std::as_const(*iter));
// ...
這確保您永遠不會通過非const
左值引用訪問底層容器的元素。
注意:如果您無權訪問c++17 ,那么實現您自己的std::as_const
版本非常簡單。 只要確保你在命名空間std
之外聲明它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.