Рассмотрим следующий код:
#include <algorithm>
#include <iostream>
#include <vector>
struct A {
int val;
bool operator<(const A& other) const {
std::cout << "operator\n";
return val < other.val;
}
};
void swap(A& a, A& b) {
std::cout << "foo\n";
std::swap(a.val, b.val);
}
int main()
{
std::vector<A> a(2);
a[0].val = 10;
a[1].val = -1;
std::sort(a.begin(), a.end());
}
C ++ 11's std::sort
помещает ValueSwappable требования к аргументам итератора, семантике перемещения и ничего больше, подразумевая, что std::sort
"гарантированно" выполнит обмен, если элементы должны быть перемещены , И 17.6.3.2/3
предполагает, что моя перегрузка определенно должна быть выбрана в этом случае.
clang 3.1 SVN libc ++ выбирает мой swap
(то есть я вижу "foo"); Libstdc ++ GCC 4.6.3 не поддерживает.
- Это ошибка GCC (при условии, что моя стандартная интерпретация верна)? Или я что-то упустил?