James Kanze wrote on 02/09/2006 18:31:En tout cas ma question est valable pour le C aussi. Pourquoi
la norme ne permet pas de comparer des structures comme il est
possible de faire des affectations?
Probablement parce qu'on n'en a pas vu l'intérêt. Après tout, si
on va implémenter ==, pourquoi pas > aussi. Voire même +.
"==" est univoque
"==" pourrait être implicite avec un (par exemple):
typeof(a) == typeof(b) && memcmp(@a, @b, sizeof(a)) == 0
James Kanze wrote on 02/09/2006 18:31:
En tout cas ma question est valable pour le C aussi. Pourquoi
la norme ne permet pas de comparer des structures comme il est
possible de faire des affectations?
Probablement parce qu'on n'en a pas vu l'intérêt. Après tout, si
on va implémenter ==, pourquoi pas > aussi. Voire même +.
"==" est univoque
"==" pourrait être implicite avec un (par exemple):
typeof(a) == typeof(b) && memcmp(@a, @b, sizeof(a)) == 0
James Kanze wrote on 02/09/2006 18:31:En tout cas ma question est valable pour le C aussi. Pourquoi
la norme ne permet pas de comparer des structures comme il est
possible de faire des affectations?
Probablement parce qu'on n'en a pas vu l'intérêt. Après tout, si
on va implémenter ==, pourquoi pas > aussi. Voire même +.
"==" est univoque
"==" pourrait être implicite avec un (par exemple):
typeof(a) == typeof(b) && memcmp(@a, @b, sizeof(a)) == 0
Fabien LE LEZ wrote on 02/09/2006 21:32:Pourquoi n'est-il pas prévu qu'il fasse de même pour l'opérateur
(par exemple) de comparaison (==)?
Un opérateur == par défaut apporterait plus de problèmes qu'il n'en
résoudrait. En effet, à chaque fois qu'il ne correspond pas, et qu'on
n'en a pas besoin, il faudrait le déclarer privé (comme pour = ).
"plus de problèmes" parce qu'il existerait qlq exceptions ?!? j'ai du
mal à suivre !
s'il ne correspond pas, on le (re)définit (localement), n'est-ce pas
le propre d'un langage objet ?
quant à savoir si "on" en a besoin ou pas, je ne connais pas ce
monsieur
s'il ne correspond pas, on le (re)définit (localement), n'est-ce pas
le propre d'un langage objet ?
Par contre, ce qui serait bien, c'est un sucre syntaxique qui
permettrait, dans une classe "simple" comme [...]
de pouvoir déclarer, simplement mais explicitement, un constructeur
C::C (int const& x_, std::string const& machin_, double const& truc_)
: x (x_), machin (machin_), truc (truc_) {}
"explicitement" tu peux déjà écrire
C::C (int x_, std::string const& machin_, double truc_)
c'est un peu plus court et strictement équivalent.Mais de toutes façons, ça ne doit pas être implicite.
tu veux dire: "il est évident" que ça ne doit pas être implicite?
Fabien LE LEZ wrote on 02/09/2006 21:32:
Pourquoi n'est-il pas prévu qu'il fasse de même pour l'opérateur
(par exemple) de comparaison (==)?
Un opérateur == par défaut apporterait plus de problèmes qu'il n'en
résoudrait. En effet, à chaque fois qu'il ne correspond pas, et qu'on
n'en a pas besoin, il faudrait le déclarer privé (comme pour = ).
"plus de problèmes" parce qu'il existerait qlq exceptions ?!? j'ai du
mal à suivre !
s'il ne correspond pas, on le (re)définit (localement), n'est-ce pas
le propre d'un langage objet ?
quant à savoir si "on" en a besoin ou pas, je ne connais pas ce
monsieur
s'il ne correspond pas, on le (re)définit (localement), n'est-ce pas
le propre d'un langage objet ?
Par contre, ce qui serait bien, c'est un sucre syntaxique qui
permettrait, dans une classe "simple" comme [...]
de pouvoir déclarer, simplement mais explicitement, un constructeur
C::C (int const& x_, std::string const& machin_, double const& truc_)
: x (x_), machin (machin_), truc (truc_) {}
"explicitement" tu peux déjà écrire
C::C (int x_, std::string const& machin_, double truc_)
c'est un peu plus court et strictement équivalent.
Mais de toutes façons, ça ne doit pas être implicite.
tu veux dire: "il est évident" que ça ne doit pas être implicite?
Fabien LE LEZ wrote on 02/09/2006 21:32:Pourquoi n'est-il pas prévu qu'il fasse de même pour l'opérateur
(par exemple) de comparaison (==)?
Un opérateur == par défaut apporterait plus de problèmes qu'il n'en
résoudrait. En effet, à chaque fois qu'il ne correspond pas, et qu'on
n'en a pas besoin, il faudrait le déclarer privé (comme pour = ).
"plus de problèmes" parce qu'il existerait qlq exceptions ?!? j'ai du
mal à suivre !
s'il ne correspond pas, on le (re)définit (localement), n'est-ce pas
le propre d'un langage objet ?
quant à savoir si "on" en a besoin ou pas, je ne connais pas ce
monsieur
s'il ne correspond pas, on le (re)définit (localement), n'est-ce pas
le propre d'un langage objet ?
Par contre, ce qui serait bien, c'est un sucre syntaxique qui
permettrait, dans une classe "simple" comme [...]
de pouvoir déclarer, simplement mais explicitement, un constructeur
C::C (int const& x_, std::string const& machin_, double const& truc_)
: x (x_), machin (machin_), truc (truc_) {}
"explicitement" tu peux déjà écrire
C::C (int x_, std::string const& machin_, double truc_)
c'est un peu plus court et strictement équivalent.Mais de toutes façons, ça ne doit pas être implicite.
tu veux dire: "il est évident" que ça ne doit pas être implicite?
Franck Branjonneau wrote on 02/09/2006 23:44:[...]
Non. Si l'égalité n'a pas de sens pour un type je ne la définis pas
pour ce type. Le problème n'est pas tant sa définition, modifiable,
mais sa déclaration qui ne l'est pas.
si une égalité n'a pas de sens je ne l' *utilise* pas; elle ferait
parti d'opérateurs implicites que cela ne me gênerait pas (non, je ne
cauchemarderais pas l'angoisse d'avoir tapé un "==" à l'insu de mon
plein gré).
Mais de toutes façons, ça ne doit pas être implicite.
tu veux dire: "il est évident" que ça ne doit pas être implicite?
Il est évident que ce ne doit pas être implicite.
c'est ce que je pensais.
Cf msg-ID
Franck Branjonneau wrote on 02/09/2006 23:44:
[...]
Non. Si l'égalité n'a pas de sens pour un type je ne la définis pas
pour ce type. Le problème n'est pas tant sa définition, modifiable,
mais sa déclaration qui ne l'est pas.
si une égalité n'a pas de sens je ne l' *utilise* pas; elle ferait
parti d'opérateurs implicites que cela ne me gênerait pas (non, je ne
cauchemarderais pas l'angoisse d'avoir tapé un "==" à l'insu de mon
plein gré).
Mais de toutes façons, ça ne doit pas être implicite.
tu veux dire: "il est évident" que ça ne doit pas être implicite?
Il est évident que ce ne doit pas être implicite.
c'est ce que je pensais.
Cf msg-ID <q7mje2ls4tlvkbg70l4rfm7utr7giinhrg@4ax.com>
Franck Branjonneau wrote on 02/09/2006 23:44:[...]
Non. Si l'égalité n'a pas de sens pour un type je ne la définis pas
pour ce type. Le problème n'est pas tant sa définition, modifiable,
mais sa déclaration qui ne l'est pas.
si une égalité n'a pas de sens je ne l' *utilise* pas; elle ferait
parti d'opérateurs implicites que cela ne me gênerait pas (non, je ne
cauchemarderais pas l'angoisse d'avoir tapé un "==" à l'insu de mon
plein gré).
Mais de toutes façons, ça ne doit pas être implicite.
tu veux dire: "il est évident" que ça ne doit pas être implicite?
Il est évident que ce ne doit pas être implicite.
c'est ce que je pensais.
Cf msg-ID
Franck Branjonneau wrote on 02/09/2006 23:36:"==" est univoque
Non.
tu fais bien de ne pas détailler, ça évite les bourdes.
(si '0' n'est plus égal à '0' et '1' à '1' on cours au pb).
Franck Branjonneau wrote on 02/09/2006 23:36:
"==" est univoque
Non.
tu fais bien de ne pas détailler, ça évite les bourdes.
(si '0' n'est plus égal à '0' et '1' à '1' on cours au pb).
Franck Branjonneau wrote on 02/09/2006 23:36:"==" est univoque
Non.
tu fais bien de ne pas détailler, ça évite les bourdes.
(si '0' n'est plus égal à '0' et '1' à '1' on cours au pb).
Franck Branjonneau wrote:Non. Que les fonctions membres définies par le compilateur
suffisent à assurer la compatibilité "ascendante" avec le C.
Est-ce que cela veut dire que si le C n'avait pas permis
l'affectation de structures, le C++ n'aurait pas défini non
plus les opérateurs par défaut qu'il définit?
Pourtant, pour des classes ou des structures avec que des
membres simples, il est un peu idiot de devoir définir
manuellement des fonctions ou méthodes qui font membre à
membre la recopie ou la comparaison.
Franck Branjonneau wrote:
Non. Que les fonctions membres définies par le compilateur
suffisent à assurer la compatibilité "ascendante" avec le C.
Est-ce que cela veut dire que si le C n'avait pas permis
l'affectation de structures, le C++ n'aurait pas défini non
plus les opérateurs par défaut qu'il définit?
Pourtant, pour des classes ou des structures avec que des
membres simples, il est un peu idiot de devoir définir
manuellement des fonctions ou méthodes qui font membre à
membre la recopie ou la comparaison.
Franck Branjonneau wrote:Non. Que les fonctions membres définies par le compilateur
suffisent à assurer la compatibilité "ascendante" avec le C.
Est-ce que cela veut dire que si le C n'avait pas permis
l'affectation de structures, le C++ n'aurait pas défini non
plus les opérateurs par défaut qu'il définit?
Pourtant, pour des classes ou des structures avec que des
membres simples, il est un peu idiot de devoir définir
manuellement des fonctions ou méthodes qui font membre à
membre la recopie ou la comparaison.
Pourtant, pour des classes ou des structures avec que des membres
simples, il est un peu idiot de devoir définir manuellement des
fonctions ou méthodes qui font membre à membre la recopie ou la
comparaison.
Peut-être, mais prenons le problème à l'envers: tu ne trouves
pas encore plus idiot de devoir déclarer manuellement
l'opérateur d'assignation et le constructeur de copie en tant
que private si tu ne veux pas que ton objet soit copiable?
Je ne voudrais pas prendre mon cas pour une généralité, mais
dans les projets que j'ai fait pour l'instant j'ai beaucoup
plus de classes qui dérivent de boost::noncopyable que de
classes pour lesquelles j'ai du écrire un opérateur d'égalité.
Et si je peux oublier de mettre des classes en noncopyable
alors qu'elles le devraient, je me rend compte assez vite
qu'un opérateur d'égalité est manquant.
Bref, la sémantique de valeur est assez minoritaire, en général, j' ai
l'impression.
Pourtant, pour des classes ou des structures avec que des membres
simples, il est un peu idiot de devoir définir manuellement des
fonctions ou méthodes qui font membre à membre la recopie ou la
comparaison.
Peut-être, mais prenons le problème à l'envers: tu ne trouves
pas encore plus idiot de devoir déclarer manuellement
l'opérateur d'assignation et le constructeur de copie en tant
que private si tu ne veux pas que ton objet soit copiable?
Je ne voudrais pas prendre mon cas pour une généralité, mais
dans les projets que j'ai fait pour l'instant j'ai beaucoup
plus de classes qui dérivent de boost::noncopyable que de
classes pour lesquelles j'ai du écrire un opérateur d'égalité.
Et si je peux oublier de mettre des classes en noncopyable
alors qu'elles le devraient, je me rend compte assez vite
qu'un opérateur d'égalité est manquant.
Bref, la sémantique de valeur est assez minoritaire, en général, j' ai
l'impression.
Pourtant, pour des classes ou des structures avec que des membres
simples, il est un peu idiot de devoir définir manuellement des
fonctions ou méthodes qui font membre à membre la recopie ou la
comparaison.
Peut-être, mais prenons le problème à l'envers: tu ne trouves
pas encore plus idiot de devoir déclarer manuellement
l'opérateur d'assignation et le constructeur de copie en tant
que private si tu ne veux pas que ton objet soit copiable?
Je ne voudrais pas prendre mon cas pour une généralité, mais
dans les projets que j'ai fait pour l'instant j'ai beaucoup
plus de classes qui dérivent de boost::noncopyable que de
classes pour lesquelles j'ai du écrire un opérateur d'égalité.
Et si je peux oublier de mettre des classes en noncopyable
alors qu'elles le devraient, je me rend compte assez vite
qu'un opérateur d'égalité est manquant.
Bref, la sémantique de valeur est assez minoritaire, en général, j' ai
l'impression.
James Kanze wrote on 02/09/2006 18:31:En tout cas ma question est valable pour le C aussi.
Pourquoi la norme ne permet pas de comparer des structures
comme il est possible de faire des affectations?
Probablement parce qu'on n'en a pas vu l'intérêt. Après
tout, si on va implémenter ==, pourquoi pas > aussi. Voire
même +.
"==" est univoque alors qu'une relation d'ordre sur N champs
ou de l'algèbre nécessite une définition de (quasi) groupe.
"==" pourrait être implicite avec un (par exemple):
typeof(a) == typeof(b) && memcmp(@a, @b, sizeof(a)) == 0
L'implémentation naturelle serait de considérer ses attributs
un à un, tout comme pour la recopie.
C-à-d qu'ils aient une mauvaise sémantique dès qu'il y a un
pointeur.
recopier un pointeur (sans ref. counting, etc) est un mauvais
effet de bord, comparer des adresses est bien ce que l'on
attend de "==".
James Kanze wrote on 02/09/2006 18:31:
En tout cas ma question est valable pour le C aussi.
Pourquoi la norme ne permet pas de comparer des structures
comme il est possible de faire des affectations?
Probablement parce qu'on n'en a pas vu l'intérêt. Après
tout, si on va implémenter ==, pourquoi pas > aussi. Voire
même +.
"==" est univoque alors qu'une relation d'ordre sur N champs
ou de l'algèbre nécessite une définition de (quasi) groupe.
"==" pourrait être implicite avec un (par exemple):
typeof(a) == typeof(b) && memcmp(@a, @b, sizeof(a)) == 0
L'implémentation naturelle serait de considérer ses attributs
un à un, tout comme pour la recopie.
C-à-d qu'ils aient une mauvaise sémantique dès qu'il y a un
pointeur.
recopier un pointeur (sans ref. counting, etc) est un mauvais
effet de bord, comparer des adresses est bien ce que l'on
attend de "==".
James Kanze wrote on 02/09/2006 18:31:En tout cas ma question est valable pour le C aussi.
Pourquoi la norme ne permet pas de comparer des structures
comme il est possible de faire des affectations?
Probablement parce qu'on n'en a pas vu l'intérêt. Après
tout, si on va implémenter ==, pourquoi pas > aussi. Voire
même +.
"==" est univoque alors qu'une relation d'ordre sur N champs
ou de l'algèbre nécessite une définition de (quasi) groupe.
"==" pourrait être implicite avec un (par exemple):
typeof(a) == typeof(b) && memcmp(@a, @b, sizeof(a)) == 0
L'implémentation naturelle serait de considérer ses attributs
un à un, tout comme pour la recopie.
C-à-d qu'ils aient une mauvaise sémantique dès qu'il y a un
pointeur.
recopier un pointeur (sans ref. counting, etc) est un mauvais
effet de bord, comparer des adresses est bien ce que l'on
attend de "==".
Question corollaire à la discussion:
Existe-t'il un moyen de comparer des structures aux membres
simples autre que la comparaison membre à membre?
J'ai une solution en tête:
Vu que le bourrage (padding) peut faire échouer une
comparaison alors que les membres sont bien égaux, je me
demande si on ne peut pas initialiser à 0 *chaque* structure:
memset((void *) &s1, 0, sizeof(s));
memset((void *) &s2, 0, sizeof(s));
Puis accèder aux membres:
s1.a = 1
s2.a = 1
Et enfin les comparer:
memcmp((void *) &s1, (void *)&s2, sizeof(s));
Questions:
- est-ce assuré de marcher?
- est-ce que ça marchera en pratique courantes? Sinon sur quelles
plate-formes?
Question corollaire à la discussion:
Existe-t'il un moyen de comparer des structures aux membres
simples autre que la comparaison membre à membre?
J'ai une solution en tête:
Vu que le bourrage (padding) peut faire échouer une
comparaison alors que les membres sont bien égaux, je me
demande si on ne peut pas initialiser à 0 *chaque* structure:
memset((void *) &s1, 0, sizeof(s));
memset((void *) &s2, 0, sizeof(s));
Puis accèder aux membres:
s1.a = 1
s2.a = 1
Et enfin les comparer:
memcmp((void *) &s1, (void *)&s2, sizeof(s));
Questions:
- est-ce assuré de marcher?
- est-ce que ça marchera en pratique courantes? Sinon sur quelles
plate-formes?
Question corollaire à la discussion:
Existe-t'il un moyen de comparer des structures aux membres
simples autre que la comparaison membre à membre?
J'ai une solution en tête:
Vu que le bourrage (padding) peut faire échouer une
comparaison alors que les membres sont bien égaux, je me
demande si on ne peut pas initialiser à 0 *chaque* structure:
memset((void *) &s1, 0, sizeof(s));
memset((void *) &s2, 0, sizeof(s));
Puis accèder aux membres:
s1.a = 1
s2.a = 1
Et enfin les comparer:
memcmp((void *) &s1, (void *)&s2, sizeof(s));
Questions:
- est-ce assuré de marcher?
- est-ce que ça marchera en pratique courantes? Sinon sur quelles
plate-formes?
On Thu, 31 Aug 2006 19:41:08 +0200, Olivier Croquette
:Pourquoi n'est-il pas prévu qu'il fasse de même pour
l'opérateur (par exemple) de comparaison (==)?
Un opérateur == par défaut apporterait plus de problèmes qu'il
n'en résoudrait. En effet, à chaque fois qu'il ne correspond
pas, et qu'on n'en a pas besoin, il faudrait le déclarer privé
(comme pour = ).
Par contre, ce qui serait bien, c'est un sucre syntaxique qui
permettrait, dans une classe "simple" comme
struct C
{
int x;
std::string machin;
double truc;
};
de pouvoir déclarer, simplement mais explicitement, un constructeur
C::C (int const& x_, std::string const& machin_, double const& truc_)
: x (x_), machin (machin_), truc (truc_) {}
et des opérateurs == et != qui comparent membre à membre.
Mais de toutes façons, ça ne doit pas être implicite.
On Thu, 31 Aug 2006 19:41:08 +0200, Olivier Croquette
<ocroquette@ocroquette.free.fr>:
Pourquoi n'est-il pas prévu qu'il fasse de même pour
l'opérateur (par exemple) de comparaison (==)?
Un opérateur == par défaut apporterait plus de problèmes qu'il
n'en résoudrait. En effet, à chaque fois qu'il ne correspond
pas, et qu'on n'en a pas besoin, il faudrait le déclarer privé
(comme pour = ).
Par contre, ce qui serait bien, c'est un sucre syntaxique qui
permettrait, dans une classe "simple" comme
struct C
{
int x;
std::string machin;
double truc;
};
de pouvoir déclarer, simplement mais explicitement, un constructeur
C::C (int const& x_, std::string const& machin_, double const& truc_)
: x (x_), machin (machin_), truc (truc_) {}
et des opérateurs == et != qui comparent membre à membre.
Mais de toutes façons, ça ne doit pas être implicite.
On Thu, 31 Aug 2006 19:41:08 +0200, Olivier Croquette
:Pourquoi n'est-il pas prévu qu'il fasse de même pour
l'opérateur (par exemple) de comparaison (==)?
Un opérateur == par défaut apporterait plus de problèmes qu'il
n'en résoudrait. En effet, à chaque fois qu'il ne correspond
pas, et qu'on n'en a pas besoin, il faudrait le déclarer privé
(comme pour = ).
Par contre, ce qui serait bien, c'est un sucre syntaxique qui
permettrait, dans une classe "simple" comme
struct C
{
int x;
std::string machin;
double truc;
};
de pouvoir déclarer, simplement mais explicitement, un constructeur
C::C (int const& x_, std::string const& machin_, double const& truc_)
: x (x_), machin (machin_), truc (truc_) {}
et des opérateurs == et != qui comparent membre à membre.
Mais de toutes façons, ça ne doit pas être implicite.
Fabien LE LEZ wrote on 02/09/2006 21:32:Pourquoi n'est-il pas prévu qu'il fasse de même pour
l'opérateur (par exemple) de comparaison (==)?
Un opérateur == par défaut apporterait plus de problèmes
qu'il n'en résoudrait. En effet, à chaque fois qu'il ne
correspond pas, et qu'on n'en a pas besoin, il faudrait le
déclarer privé (comme pour = ).
"plus de problèmes" parce qu'il existerait qlq exceptions ?!?
j'ai du mal à suivre !
Mais de toutes façons, ça ne doit pas être implicite.
tu veux dire: "il est évident" que ça ne doit pas être
implicite?
Fabien LE LEZ wrote on 02/09/2006 21:32:
Pourquoi n'est-il pas prévu qu'il fasse de même pour
l'opérateur (par exemple) de comparaison (==)?
Un opérateur == par défaut apporterait plus de problèmes
qu'il n'en résoudrait. En effet, à chaque fois qu'il ne
correspond pas, et qu'on n'en a pas besoin, il faudrait le
déclarer privé (comme pour = ).
"plus de problèmes" parce qu'il existerait qlq exceptions ?!?
j'ai du mal à suivre !
Mais de toutes façons, ça ne doit pas être implicite.
tu veux dire: "il est évident" que ça ne doit pas être
implicite?
Fabien LE LEZ wrote on 02/09/2006 21:32:Pourquoi n'est-il pas prévu qu'il fasse de même pour
l'opérateur (par exemple) de comparaison (==)?
Un opérateur == par défaut apporterait plus de problèmes
qu'il n'en résoudrait. En effet, à chaque fois qu'il ne
correspond pas, et qu'on n'en a pas besoin, il faudrait le
déclarer privé (comme pour = ).
"plus de problèmes" parce qu'il existerait qlq exceptions ?!?
j'ai du mal à suivre !
Mais de toutes façons, ça ne doit pas être implicite.
tu veux dire: "il est évident" que ça ne doit pas être
implicite?