iterator_traits::difference_type

C++ コンテナの要素位置をトラッキングするイテレーター。
イテレーター間の距離をもとめる std::distance 関数が標準に定義されている。

その戻り値の型はイテレーターに定義された difference_type で、これは ptrdiff_t の別名として定義されている。(距離という名前から想像されるものと違い、正と負の符号がつく)

ptrdiff_t はポインター間の差を格納するのに十分な整数型。ということで、つまり対象アプリケーションがアドレスできるメモリー空間のサイズを絶対値として、その正負をつけた数を取るということ。
おおむね 32bit アプリケーションなら int、 64bit アプリなら long int と考えたらよいだろう。

* * *

Visual Studio 2015 でコンパイルすると int にキャストしないと怒られると聞いて、しかして僕は VS2015 を持っていない。代わりに g++ 11.1.0 を用意してみたけれど -Wall -Wextra でコンパイルしても、以下コードではとくに警告されない。

#include <iterator>
int main() {
  const int i = 0;
  return std::distance(&i, &i);
}  // g++ -Wall -Wextra で警告がでない

なぜだろう? とつぶやいたところ親切な人が教えてくれた。(助かる)

この場合は -Wconversion で型変換の警告を有効にして、さらに -std=c++14 と C++14 規格で翻訳すると怒ってもらえる。(g++ 11.1.0 現在、デフォルトで -std=c++17 相当?)

あるいは(生のポインターでなく)コンテナのイテレーターを渡せば -Wconversion だけで叱ってもらえる。

#include <vector>
int main() {
  auto container = std::vector<int>();
  return std::distance(container.begin(), container.end());
} // g++ -Wconversion でキャストの警告がでる


この記事が気に入ったらサポートをしてみませんか?