Boost logo

Boost :

Subject: Re: [boost] [swap] please update documentation...
From: Dmitry Goncharov (dgoncharov_at_[hidden])
Date: 2009-06-30 03:42:19


Dmitry Goncharov wrote:
>
>
> adam.butcher_at_[hidden] wrote:
>> Hi Niels,
>>
>> I tried the above with gcc 4.4.0 and stlport. It chose std::swap
>> (stlport's) via ADL and failed to compile due to 'invalid array
>> assignment' as expected. It seems that the issue is with gcc 4.4.0's
>> latest standard library rather than a broken ADL or other such
>> detail. Looks like the latest gcc std::swap supports c-style array
>> swapping.
>>
>>
> You are right. bits/algorithmfwd.h contains
> template <typename _Tp, size_t _Nm>
> void
> swap(_Tp (&)[_Nm], _Tp (&)[_Nm]);
And bits/move.h contains the implementation
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // DR 809. std::swap should be overloaded for array types.
  template<typename _Tp, size_t _Nm>
    inline void
    swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
    {
      for (size_t __n = 0; __n < _Nm; ++__n)
swap(__a[__n], __b[__n]);
    }
>> #---------- GCC 4.4.0 + STLport 5.1.3 ------------
>>
>> g++ swap.cpp
>> swap.cpp:19: instantiated from here
>> ..../STLport-5.1.3-native/stlport/stl/_algobase.h:93: error: invalid
>> array assignment
>>
>> #---------- GCC 4.4.0 + libstdc++ 4.4.0 -----------
>>
>> CPLUS_INCLUDE_PATH= g++ swap.cpp
>> ../a.out
>> # no exception is thrown -- it's picking std::swap
>>
>> #---------- GCC 4.2.3 + libstdc++ 4.2.3 ------------
>>
>> CPLUS_INCLUDE_PATH= g++-4.2.3 swap.cpp
>> swap.cpp:19: instantiated from here
>> .../include/c++/4.2.3/bits/stl_algobase.h:100: error: invalid array
>> assignment
>>
>> #---------- GCC 4.4.0 + libstdc++ 4.4.0 -----------
>>
>> The following compiles fine with 4.4.0 std library. Switch to
>> stlport headers and it fails to compile as expected.
>>
>> CPLUS_INCLUDE_PATH= g++ -xc++ - << EOF
>> #include <string>
>> #include <algorithm>
>>
>> int main()
>> {
>> std::string a[42], b[42];
>> std::swap(a, b);
>> }
>> EOF
>> #----------------------------------------
>>
>> Does the C++0x library allow for std::swap with c-style arrays? If
>> so, maybe the issue is that g++ is implementing it without needing
>> you to specify --std=c++0x. I guess it is not breaking any existing
>> use of std::swap -- just making a missing case work (?)
>>
>> Just to check that it actually is swapping I changed the body of the
>> last snippet to:
>>
>> std::string a[42] = { "a", }, b[42] = { "b", };
>> std::swap(a, b);
>> return a[0][0] - 'a';
>>
>> and it did indeed swap. The return code was 1, not 0 -- so the first
>> string in 'a' after the swap began with char 'b'.
>>
>> Hope this info's useful.
>> Regards
>> Adam
>>
>>
>>
> BR, Dmitry
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk