Condition pour être "swappable"
Bonjour,
Ce code ne compile pas :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <type_traits>
class Foo {
public:
Foo(int& r) :
ref(r) {
}
int& ref;
};
namespace std {
void swap(Foo& lhs, Foo& rhs) {
(void) lhs;
(void) rhs;
}
}
int main() {
static_assert(std::is_swappable<Foo>(), "Foo");
int v = 42;
Foo e(v), f(v);
std::swap(e, f);
} |
Voici l'erreur remontée :
g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In function 'int main()':
main.cpp:19:2: error: static assertion failed: Foo
static_assert(std::is_swappable<Foo>(), "Foo");
Si j'enlève l'assertion statique, le compile et s'exécute en passant bien dans ma fonction swap() custom. D'après la doc de std::is_swappable, je pensais que mon code aurait dû être OK.
:arrow: Pourriez-vous m'expliquer pourquoi ce code ne compile pas ?
J'ai ensuite enlevé ma fonction swap() custom. Le code ne compile plus car aucune surcharge correcte de swap() n'est trouvée. D'après mes tests, c'est parce que la classe contient un champ de type int& mais ne possède pas d'opérateur de copie.
:arrow: Est-ce correct ? Pas besoin d'un constructeur par copie en plus ?
Merci d'avance ! :ccool: