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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.