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]

Re: egcs-1.0.2 STL problem?


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]