[cross-post sur fr.comp.lang.c++]
Bonjour,
suite à une discussion sur map::insert et de l'utilisation de map<>::value_type ou de std::make_pair, j'ai n'ai pas réussi à faire un exemple ou std::make_pair fonctionnerait alors que value_type ne fonctionnerait pas (gcc ou VS)
J'avais souvenir d'un problème de conversion implicite (Josuttis en parle dans The C++ Standard Library 2nd Ed, page 341), constaté à l'époque sur aCC (hpux), notamment avec les std::string et const char*
Aujourd'hui, je n'arrive pas à retrouver ce problème avec ni gcc 4.8 ni vs2012.
Du coup, je n'ai pas d'argument technique (vu que je n'arrive pas à le reproduire) pour préférer std::make_pair...
Il reste, que c'est toujours plus court à taper, et moins à du renommage sur le typedef par exemple.
Quand est-il au niveau de la norme ?
Voici mon exemple qui fonctionne... (avec le explicit ni la forme value_type ni la forme make_pair fonctionne)
edit:
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 #include <map> #include <string> #include <utility> using namespace std; struct MyInt { /* explicit */ MyInt(int s) : i(s) {} int i; }; inline bool operator<(const MyInt& lhs, const MyInt& rhs) { return lhs.i < rhs.i; } int main() { typedef map<MyInt, std::string> Ints; Ints ints; ints.insert(Ints::value_type(2, "aCString")); ints.insert(make_pair(2, "aCString")); }
en C++11,
sont à priori des alternatives plus intéressantes (plus courtes, moins sensibles au renommage, moins de copie/move pour emplace)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ints.insert({2, "aCString"}); ints.emplace(2, "aCString");
Partager