This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Dup status.

### 536. Container iterator constructor and explicit convertibility

Section: 22.2 [container.requirements] Status: Dup Submitter: Joaquín M López Muñoz Opened: 2005-12-17 Last modified: 2016-01-28

Priority: Not Prioritized

View all other issues in [container.requirements].

View all issues with Dup status.

Duplicate of: 589

Discussion:

The iterator constructor X(i,j) for containers as defined in 23.1.1 and 23.2.2 does only require that i and j be input iterators but nothing is said about their associated value_type. There are three sensible options:

1. iterator's value_type is exactly X::value_type (modulo cv).
2. iterator's value_type is *implicitly* convertible to X::value_type.
3. iterator's value_type is *explicitly* convertible to X::value_type.

The issue has practical implications, and stdlib vendors have taken divergent approaches to it: Dinkumware follows 2, libstdc++ follows 3.

The same problem applies to the definition of insert(p,i,j) for sequences and insert(i,j) for associative contianers, as well as assign.

[ The following added by Howard and the example code was originally written by Dietmar. ]

Valid code below?

>     #include <vector>
>     #include <iterator>
>     #include <iostream>

>     struct foo
>     {
>         explicit foo(int) {}
>     };

>     int main()
>     {
>         std::vector<int> v_int;
>         std::vector<foo> v_foo1(v_int.begin(), v_int.end());
>         std::vector<foo> v_foo2((std::istream_iterator<int>(std::cin)),
>                                  std::istream_iterator<int>());
>     }

[ Berlin: Some support, not universal, for respecting the explicit qualifier. ]

Proposed resolution: