Рассмотрим следующий код:Предполагается, что моя перегрузка `swap` должна использоваться? Является ли это ошибкой libstdC++ (GCC)?
#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());
}
11 C++ в std::sort
мест ValueSwappable требования к аргументам итераторов двигаться семантику и ничего, подразумевая, что std::sort
будет «гарантировано», чтобы выполнить обмен, если элементы должны перемещаться. И 17.6.3.2/3
предполагает, что моя перегрузка определенно должна быть выбрана в этом случае.
- Это правильно?
clang 3.1 SVC libC++ выбирает мой swap
(то есть я вижу «foo»); GCC 4.6.3 libstdC++ этого не делает.
- Является ли это ошибкой GCC (при условии, что моя стандартная интерпретация верна)? Или я чего-то не хватает?
** Примечание: ** Я полагаю, [этот способ 'swap'ping не рекомендуется] (http://stackoverflow.com/questions/11562/how-to-overload-stdswap), но я все равно как знать, что здесь происходит. –
Похоже, что ADL не используется, чтобы найти перегруженную версию 'swap' с gcc, где, как clang использует ADL. Были некоторые комментарии к потоку, который вы указали на это шоу, что использование ADL для поиска 'swap' на' std :: sort' не является стандартным среди компиляторов. – Jason
@ Джейсон: Почему ADL вообще будет задействован для бесплатной функции в глобальном пространстве имен? –