Forcer le déplacement d'un objet incopiable
Bonjour.
Je cherche à déplacer un objet incopiable dans un std::set pour que ce dernier en devienne le propriétaire, mais le code suivant provoque plusieurs erreur.
Apparemment le compilateur a du mal avec la fonction variadique et la substitution d'arguments.
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 25 26 27 28 29 30 31 32 33 34
| #include <set>
struct Element {
Element(int i = 0) : i(i) {};
Element(Element const&) = delete;
Element(Element&&) = default;
int i;
};
bool operator < (const Element& Element1, const Element& Element2) {
return Element1.i < Element2.i;
}
struct Container {
std::set<Element> elems;
void addElements() {}
template<class ... Tail>
void addElements(Element const&& elem, Tail&& ... tail) {
elems.insert(elem);
addElements(std::forward<Tail>(tail)...);
}
};
int main(int, char**) {
Container container;
container.addElements(Element(9), Element(36));
Element elem = 25;
container.addElements(elem);
return 0;
} |
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 25
| main.cpp: In function int main(int, char**):
main.cpp:31:28: error: no matching function for call to Container::addElements(Element&)
container.addElements(elem);
^
main.cpp:31:28: note: candidates are:
main.cpp:17:7: note: void Container::addElements()
void addElements() {}
^
main.cpp:17:7: note: candidate expects 0 arguments, 1 provided
main.cpp:20:7: note: template<class ... Tail> void Container::addElements(const Element&&, Tail&& ...)
void addElements(Element const&& elem, Tail&& ... tail) {
^
main.cpp:20:7: note: template argument deduction/substitution failed:
main.cpp:31:28: note: cannot convert elem (type Element) to type const Element&&
container.addElements(elem);
In file included from /**** blah blah ****/
main.cpp:21:20: required from void Container::addElements(const Element&&, Tail&& ...) [with Tail = {Element}]
main.cpp:28:47: required from here
/usr/include/c++/4.9/ext/new_allocator.h:120:4: error: use of deleted function Element::Element(const Element&)
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
^
main.cpp:5:2: note: declared here
Element(Element const&) = delete;
^ |
Je voudrais savoir si il est possible de modifier Container pour qu'il déplace tout ce qui va dans addElements sans toucher au code client.
J'ai déjà tenté de surcharger addElements(Element const&) sans plus de résultats.
Cordialement.