簡體   English   中英

我可以依賴initializer_list :: const_iterator作為普通指針嗎?

[英]Can I rely on initializer_list::const_iterator being a plain pointer?

這個問題表明std::initializer_list<int>::const_iterator類型只是一個普通的int const*指針,但是這個答案引用的標准的措辭(對於同一個問題)聽起來更像是一個建議而不是保證對我來說。

在我的代碼中,問題發生如下:我有一個函數處理initializer_list的子范圍,在不同的情況下,我重用傳遞單個元素的便捷函數的代碼(作為單元素范圍):

void doStuff(int const* begin, int const* end)
{ ... do stuff ... }

  // main use; in the real code, 'init' is a parameter of a function
  std::initializer_list<int> init({1, 2, 3, 4, 5});
  doStuff(init.begin() + 1, init.end());

  // alternative use of doStuff, relies on the pointer assumption
  int x = 6;
  doStuff(&x, (&x) + 1);
}

這種結構依賴於迭代器確實是指針的事實。 它至少適用於我的clang ++ 3.9編譯器。 我可以依靠它來始終工作,即指針假設是否可移植? 保證便攜? 或者我應該將doStuff的參數類型更改為模板參數,以確保安全嗎?

template <typename Iterator>
void doStuff(Iterator begin, Iterator end)
{ ... do stuff ... }

是的,你可以依賴它,來自C ++ 14的 18.9為我們提供了class initializer_list的定義:

typedef const E* iterator; typedef const E* const_iterator;

C ++中的其他類型是不同的 - 例如std::vector ,其中迭代器是實現定義的,有些實現使用原始指針作為迭代器,有些使用類。

該標准的第18.9節給出了<initializer_list>標題的概要,如下所示:

 namespace std { template<class E> class initializer_list { public: typedef E value_type; typedef const E& reference; typedef const E& const_reference; typedef size_t size_type; typedef const E* iterator; typedef const E* const_iterator; constexpr initializer_list() noexcept; constexpr size_t size() const noexcept; // number of elements constexpr const E* begin() const noexcept; // first element constexpr const E* end() const noexcept; // one past the last element }; // 18.9.3 initializer list range access template<class E> constexpr const E* begin(initializer_list<E> il) noexcept; template<class E> constexpr const E* end(initializer_list<E> il) noexcept; } 

此外, initializer_list上的begin()end()函數保證返回const E* ,我們可以從18.9.2中看到。

所以是的,你可以依靠它。

暫無
暫無

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

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