Pouvez-vous m'expliquer la magie dans « m[s] = t » ?
Je comprends le premier constructeur comme la création d'un objet test
pour y copier ensuite le contenu de t. En revanche, je ne comprends pas
les deux destructeurs qui suivent...
Pouvez-vous m'expliquer la magie dans "m[s] = t" ?
Je comprends le premier constructeur comme la création d'un objet test pour y copier ensuite le contenu de t. En revanche, je ne comprends pas les deux destructeurs qui suivent...
Ce sont des destructions des temporaires dans std::map.
Il lui en faut deux, parce que "m[s]" est l'équivalent de "m.insert( std::make_pair( s, test() ) )". Le premier temporaire, c'est celui qui sert de paramètre de `std::make_pair` ; c'est celui construit par le constructeur par défaut. Le deuxième, c'est le membre du "std::pair" construit (par le constructeur de copie) pour le passer comme paramètre à std::map<>::insert. Un troisième serait construit comme partie de l'entrée dans le map, mais celui-là n'est pas un temporaire ; il perdurera bien au-delà de l'expression.
-- James
On Monday, 8 July 2013 15:12:49 UTC+1, Benoit Izac wrote:
Pouvez-vous m'expliquer la magie dans "m[s] = t" ?
Je comprends le premier constructeur comme la création d'un objet test
pour y copier ensuite le contenu de t. En revanche, je ne comprends pas
les deux destructeurs qui suivent...
Ce sont des destructions des temporaires dans std::map.
Il lui en faut deux, parce que "m[s]" est l'équivalent de
"m.insert( std::make_pair( s, test() ) )". Le premier
temporaire, c'est celui qui sert de paramètre de
`std::make_pair` ; c'est celui construit par le constructeur par
défaut. Le deuxième, c'est le membre du "std::pair" construit
(par le constructeur de copie) pour le passer comme paramètre
à std::map<>::insert. Un troisième serait construit comme partie
de l'entrée dans le map, mais celui-là n'est pas un temporaire ;
il perdurera bien au-delà de l'expression.
Pouvez-vous m'expliquer la magie dans "m[s] = t" ?
Je comprends le premier constructeur comme la création d'un objet test pour y copier ensuite le contenu de t. En revanche, je ne comprends pas les deux destructeurs qui suivent...
Ce sont des destructions des temporaires dans std::map.
Il lui en faut deux, parce que "m[s]" est l'équivalent de "m.insert( std::make_pair( s, test() ) )". Le premier temporaire, c'est celui qui sert de paramètre de `std::make_pair` ; c'est celui construit par le constructeur par défaut. Le deuxième, c'est le membre du "std::pair" construit (par le constructeur de copie) pour le passer comme paramètre à std::map<>::insert. Un troisième serait construit comme partie de l'entrée dans le map, mais celui-là n'est pas un temporaire ; il perdurera bien au-delà de l'expression.
-- James
Benoit Izac
Bonjour,
le 10/07/2013 à 18:33, James Kanze a écrit dans le message :
Pouvez-vous m'expliquer la magie dans "m[s] = t" ?
Je comprends le premier constructeur comme la création d'un objet test pour y copier ensuite le contenu de t. En revanche, je ne comprends pas les deux destructeurs qui suivent...
Ce sont des destructions des temporaires dans std::map.
Il lui en faut deux, parce que "m[s]" est l'équivalent de "m.insert( std::make_pair( s, test() ) )". Le premier temporaire, c'est celui qui sert de paramètre de `std::make_pair` ; c'est celui construit par le constructeur par défaut. Le deuxième, c'est le membre du "std::pair" construit (par le constructeur de copie) pour le passer comme paramètre à std::map<>::insert. Un troisième serait construit comme partie de l'entrée dans le map, mais celui-là n'est pas un temporaire ; il perdurera bien au-delà de l'expression.
Merci, j'ai bien compris le fonctionnement.
Concernant l'équivalence entre m[s] et m.insert(...), c'est garantie ou c'est propre à l'implémentation ?
-- Benoit Izac
Bonjour,
le 10/07/2013 à 18:33, James Kanze a écrit dans le message
<01aa6c82-5650-418c-a756-6d18ac12931b@googlegroups.com> :
Pouvez-vous m'expliquer la magie dans "m[s] = t" ?
Je comprends le premier constructeur comme la création d'un objet test
pour y copier ensuite le contenu de t. En revanche, je ne comprends pas
les deux destructeurs qui suivent...
Ce sont des destructions des temporaires dans std::map.
Il lui en faut deux, parce que "m[s]" est l'équivalent de
"m.insert( std::make_pair( s, test() ) )". Le premier
temporaire, c'est celui qui sert de paramètre de
`std::make_pair` ; c'est celui construit par le constructeur par
défaut. Le deuxième, c'est le membre du "std::pair" construit
(par le constructeur de copie) pour le passer comme paramètre
à std::map<>::insert. Un troisième serait construit comme partie
de l'entrée dans le map, mais celui-là n'est pas un temporaire ;
il perdurera bien au-delà de l'expression.
Merci, j'ai bien compris le fonctionnement.
Concernant l'équivalence entre m[s] et m.insert(...), c'est garantie ou
c'est propre à l'implémentation ?
le 10/07/2013 à 18:33, James Kanze a écrit dans le message :
Pouvez-vous m'expliquer la magie dans "m[s] = t" ?
Je comprends le premier constructeur comme la création d'un objet test pour y copier ensuite le contenu de t. En revanche, je ne comprends pas les deux destructeurs qui suivent...
Ce sont des destructions des temporaires dans std::map.
Il lui en faut deux, parce que "m[s]" est l'équivalent de "m.insert( std::make_pair( s, test() ) )". Le premier temporaire, c'est celui qui sert de paramètre de `std::make_pair` ; c'est celui construit par le constructeur par défaut. Le deuxième, c'est le membre du "std::pair" construit (par le constructeur de copie) pour le passer comme paramètre à std::map<>::insert. Un troisième serait construit comme partie de l'entrée dans le map, mais celui-là n'est pas un temporaire ; il perdurera bien au-delà de l'expression.
Merci, j'ai bien compris le fonctionnement.
Concernant l'équivalence entre m[s] et m.insert(...), c'est garantie ou c'est propre à l'implémentation ?
-- Benoit Izac
James Kanze
On Wednesday, 10 July 2013 22:33:28 UTC+1, Benoit Izac wrote:
Concernant l'équivalence entre m[s] et m.insert(...), c'est garantie ou c'est propre à l'implémentation ?
La norme dit simplement que "If there is no key equivalent to x in the map, inserts value_type(x, T()) into the map." L'implémentation triviale est:
Encore que ça crée une instance de T() même si on n'en a pas besoin. Les deux implémentations auxquels j'ai accès n'appellent `insert` (et donc, ne créent des temporaires) que si la clé n'est pas présent.
-- James
On Wednesday, 10 July 2013 22:33:28 UTC+1, Benoit Izac wrote:
Concernant l'équivalence entre m[s] et m.insert(...), c'est garantie ou
c'est propre à l'implémentation ?
La norme dit simplement que "If there is no key equivalent to
x in the map, inserts value_type(x, T()) into the map."
L'implémentation triviale est:
Encore que ça crée une instance de T() même si on n'en a pas
besoin. Les deux implémentations auxquels j'ai accès
n'appellent `insert` (et donc, ne créent des temporaires) que si
la clé n'est pas présent.
Encore que ça crée une instance de T() même si on n'en a pas besoin. Les deux implémentations auxquels j'ai accès n'appellent `insert` (et donc, ne créent des temporaires) que si la clé n'est pas présent.
-- James
espie
In article , James Kanze wrote:
On Wednesday, 10 July 2013 22:33:28 UTC+1, Benoit Izac wrote:
Concernant l'équivalence entre m[s] et m.insert(...), c'est garantie ou c'est propre à l'implémentation ?
La norme dit simplement que "If there is no key equivalent to x in the map, inserts value_type(x, T()) into the map." L'implémentation triviale est:
Encore que ça crée une instance de T() même si on n'en a pas besoin. Les deux implémentations auxquels j'ai accès n'appellent `insert` (et donc, ne créent des temporaires) que si la clé n'est pas présent.
Je soupconne fortement que ca va se comporter de facon plus efficace si on passe en C++2011...
In article <02313d8c-aac9-4603-8169-49d13688d51b@googlegroups.com>,
James Kanze <james.kanze@gmail.com> wrote:
On Wednesday, 10 July 2013 22:33:28 UTC+1, Benoit Izac wrote:
Concernant l'équivalence entre m[s] et m.insert(...), c'est garantie ou
c'est propre à l'implémentation ?
La norme dit simplement que "If there is no key equivalent to
x in the map, inserts value_type(x, T()) into the map."
L'implémentation triviale est:
Encore que ça crée une instance de T() même si on n'en a pas
besoin. Les deux implémentations auxquels j'ai accès
n'appellent `insert` (et donc, ne créent des temporaires) que si
la clé n'est pas présent.
Je soupconne fortement que ca va se comporter de facon plus efficace
si on passe en C++2011...
Encore que ça crée une instance de T() même si on n'en a pas besoin. Les deux implémentations auxquels j'ai accès n'appellent `insert` (et donc, ne créent des temporaires) que si la clé n'est pas présent.
Je soupconne fortement que ca va se comporter de facon plus efficace si on passe en C++2011...