libstdc++ of g++ 3.4.x: std::swap and std::auto_ptr causes compilation errors

Vinzenz Feenstra evilissimo@web.de
Tue Nov 16 09:10:00 GMT 2004


Paolo Carlini wrote:

> Vinzenz Feenstra wrote:
>
>> I had no problems with 3.3.x and 3.2.x, other versions I didn't test, 
>> but in my opinion it is strange.
>
>
> If true, would be definitely strange, since AFAIK, nothing changed in 
> this area recently.
>
> Can you send over a short snippet that now leads (correctly) to 
> compilation errors and didn't earlier?
>
> Thanks,
> Paolo.

Ok

I mentioned the problem while compiling OpenC++ and OpenC++ Core there 
is a file called MetacompilerConfiguration.h which uses auto_ptr and swap
but I made an other example which works with 3.3 and don't work with 3.4

// Example:
#include <memory>
#include <algorithm>
#include <iostream>

class TestClass
{
    int value;
  public:
     TestClass(int val_):value(val_){}
    ~TestClass(){}
     void Print(){ std::cout << "My Value is: " << value << std::endl;}
};


int main()
{
 
  std::auto_ptr<TestClass> A(new TestClass(0));
  std::auto_ptr<TestClass> B(new TestClass(1));

  A->Print();
  B->Print();
 
  std::cout << "Swapping A and B " << std::endl;

  std::swap(A ,B);

  A->Print();
  B->Print();

  return 0;
}
// Example ends


I had a view on bits/stl_algobase.h of 3.3 and 3.4 this is the 
difference of them:

std::swap of 3.3:

  template<typename _Tp>
    inline void
    swap(_Tp& __a, _Tp& __b)
    {
      // concept requirements
      __glibcpp_function_requires(_SGIAssignableConcept<_Tp>)
     
      _Tp __tmp = __a;
      __a = __b;
      __b = __tmp;
    }

std::swap of 3.4
  template<typename _Tp>
    inline void
    swap(_Tp& __a, _Tp& __b)
    {
      // concept requirements
      __glibcpp_function_requires(_SGIAssignableConcept<_Tp>)
     
      const _Tp __tmp = __a; // <-- this is the problem in my opinion
      __a = __b;
      __b = __tmp;
    }


BR

Vinzenz



More information about the Libstdc++ mailing list