Ça aide :aie: Merci pour l'info !
Il semblerait que non, cf. le code suivant.
... qui affiche :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 struct C { std::vector<int> v; C() { std::cout << "C()" << std::endl; } C(const C& c) : v(c.v) { std::cout << "C(const C&)" << std::endl; } C(C&& c) : v(std::move(c.v)) { std::cout << "C(C&&)" << std::endl; } void insert(std::vector<int>::iterator iter, int&& i) { v.insert(iter, std::move(i)); } void insert(std::vector<int>::iterator iter, const int& i) { v.insert(iter, i); } void erase(std::vector<int>::iterator iter) { v.erase(iter); } std::vector<int>::iterator end() { return v.end(); } }; int main() { C va; safePushBack(va, 1, va, 2); std::cout << va.v.size() << std::endl; }
Par contre j'ai fait une erreur. Il ne faut pas utiliser std::move mais std::forward, sinon on déplace toujours les objets (même quand l'utilisateur donne une l-value) :Citation:
C()
2
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 template <class C, class T> static inline void safePushBack(C& cont, T&& i) { cont.insert(std::end(cont), std::forward<T>(i)); } template <class C, class T, class ... Args> static inline void safePushBack(C& cont, T&& i, Args&&... args) { cont.insert(std::end(cont), std::forward<T>(i)); try { safePushBack(std::forward<Args>(args)...); } catch(...) { cont.erase(std::end(cont)); throw; } }