
Adam Butcher wrote:
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.
Thanks very much. Dmitry Goncharov wrote:
You are right. bits/algorithmfwd.h contains template <typename _Tp, size_t _Nm> void swap(_Tp (&)[_Nm], _Tp (&)[_Nm]);
Cool! But still I'm concerned about the results from Peter Simons, compiled with g++ 4.4.0 20090526 (prerelease). As that particular version appears to pick boost::swap, instead of std::swap. The implementation of boost::swap depends on compilers preferring std::swap<T>(T&,T&) over boost::swap<T1,T2>(T1&,T2&), in case of an unqualified swap function call. Thereby, ambiguity is avoided, as was suggested by Steven Watanabe. I really hope this will still work on the latest version of GCC. Adam and Peter, could you please also test the following on g++ 4.4.0? I really hope it compiles! //////////////////////////////////////// namespace foo // "boost" { template<class T1, class T2> void swap(T1&, T2&) { // Trigger a compile error. int staticAssert[sizeof(T1)!=sizeof(T2)] = {1}; } } namespace bar // "std" { template<class T> void swap(T&, T&) { return; // okay. } class string {}; } int main() { bar::string a1[42]; bar::string a2[42]; using foo::swap; swap(a1, a2); } //////////////////////////////////////// At least, it does compile on g++ 4.1.2, at http://codepad.org/0lyaPrym Kind regards, Niels