teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2018/08/06 01:32

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -17,4 +17,9 @@
17
17
  template<class InputIter, class = typename iterator_traits<InputIter>::value_type>
18
18
  X(InputIter fi, InputIter la) : n(distance(fi, la))
19
19
  ```
20
- `iterator_traits`クラステンプレートはイテレーターの情報を取得するクラスですが、テンプレート引数にイテレーターとして無効な型を渡すと、中身が空になります。したがって、引数にint値を渡すと、`iterator_traits<int>`は中身が空っぽの構造体となり、`iterator_traits<int>::value_type`は存在しないため不一致となり、サイズ指定の方が呼ばれるようになります。
20
+ `iterator_traits`クラステンプレートはイテレーターの情報を取得するクラスですが、テンプレート引数にイテレーターとして無効な型を渡すと、中身が空になります。したがって、引数にint値を渡すと、`iterator_traits<int>`は中身が空っぽの構造体となり、`iterator_traits<int>::value_type`は存在しないため不一致となり、サイズ指定の方が呼ばれるようになります。
21
+
22
+ ---
23
+ 追記
24
+
25
+ 実際の`vector`クラスも同様のことをやっていますが、その方法はライブラリーの実装によって違うと思います。興味がおありでしたらvectorヘッダーの中身を見て実際にどのように書かれているか確認してみると良いでしょう。

1

記述ミス訂正

2018/08/06 01:32

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -17,4 +17,4 @@
17
17
  template<class InputIter, class = typename iterator_traits<InputIter>::value_type>
18
18
  X(InputIter fi, InputIter la) : n(distance(fi, la))
19
19
  ```
20
- `iterator_traits`クラステンプレートはイテレーターの情報を取得するクラスですが、テンプレート引数にイテレーターとして無効な型を渡すと、中身が空になります。したがって、引数にint値を渡すと、`iterator_traits<int>`は中身が空っぽの構造体となり、`iterator_traits<InputIter>::value_type`は存在しないため不一致となり、サイズ指定の方が呼ばれるようになります。
20
+ `iterator_traits`クラステンプレートはイテレーターの情報を取得するクラスですが、テンプレート引数にイテレーターとして無効な型を渡すと、中身が空になります。したがって、引数にint値を渡すと、`iterator_traits<int>`は中身が空っぽの構造体となり、`iterator_traits<int>::value_type`は存在しないため不一致となり、サイズ指定の方が呼ばれるようになります。