簡體   English   中英

使用迭代器的泛型函數中的 const 正確性

[英]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_tconst )是錯誤的,因為您的 function 應該能夠在非const范圍內運行。

由於 ,您可以在每次尊重迭代器時使用std::as_const

// ...
*out++ = some_operation(std::as_const(*iter));
// ...

這確保您永遠不會通過非const左值引用訪問底層容器的元素。

注意:如果您無權訪問 ,那么實現您自己的std::as_const版本非常簡單。 只要確保你在命名空間std之外聲明它。

暫無
暫無

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

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