[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)
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"));
}
edit:
en C++11,

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
   ints.insert({2, "aCString"});
   ints.emplace(2, "aCString");
sont à priori des alternatives plus intéressantes (plus courtes, moins sensibles au renommage, moins de copie/move pour emplace)