This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Pinwu Xu writes: > vector<int> a_i_vec(5, 0); This is a common STL gotcha. Standard template class vector provides several different constructors, and two of them are viable: explicit vector(size_type n, const T& value); template <class InputIterator> vector(InputIterator first, InputIterator last); simplyfing for the case of vector<int> and instantiating the template constructor for InputIterator=int, we get: vector(size_type, const int&); vector(int, int); Since size_type is size_t, which is unsigned int, the second constructor is preferred over the first one, since it is an exact match. > int dummy_int(0); > vector<int> a_i_vec(5, dummy_int); > it works. egcs's STL is broken in this respect, because it defines two non-standard constructors: vector(int n, const T& value) { fill_initialize(n, value); } vector(long n, const T& value) { fill_initialize(n, value); } Now, since dummy_int is an lvalue (0 was not, so these constructors were not selected because they would involve the creation of temporaries), the first of these two constructors is selected as an exact match. But there constructors should not be defined, since they break ANSI/ISO C++ compliance. Unfortunately, stl_vector is imported as-is from the SGI implementation of STL. Would someone who is in touch with SGI developers please forward this message to them? -- Alexandre Oliva mailto:oliva@dcc.unicamp.br mailto:aoliva@acm.org http://www.dcc.unicamp.br/~oliva Universidade Estadual de Campinas, SP, Brasil
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |