"Loïc Joly" a écrit dans le message de news: bj8au2$7vv$
Fred wrote:
je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union { Vector3f v3f; Vector4f v4f; } }
Mon compilateur rejette une telle definition car Vector3f et Vector4f ont
des "copy constructor". Je ne comprends pas (encore:-) pourquoi...
Parce que c'est interdit dans le standard.
9.5 Unions [...] An object of a class with a nontrivial constructor (12.1), a nontrivial copy constructor (12.8), a nontrivial destructor (12.4), or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, or can an array of such objects.
Je suppose que c'est parce qu'il ne serait pas évident pour le compilateur d'appeller les bonnes fonction :
union U { A a; B b; C c; };
void (f) { U u; if (b) // b étant une variable tappée au clavier par l'utilisateur { u.a = ... } else { u.b = ... } // 100000 lignes de code u.c = ... // Ici, le compilateur doit appeler le destructeur de A ou celui de B en fonction de ce que l'utilisateur a tappé au clavier... }
C'est un bon exemple, ca aide a comprendre. Mais si aucun des destructeurs n'est defini (c'est a dire que l'on se contente du destructeur par defaut) cela ne semblerait pas poser trop de problemes.
Merci
"Loïc Joly" <loic.actarus.joly@wanadoo.fr> a écrit dans le message de news:
bj8au2$7vv$1@news-reader2.wanadoo.fr...
Fred wrote:
je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
}
Mon compilateur rejette une telle definition car Vector3f et Vector4f
ont
des "copy constructor".
Je ne comprends pas (encore:-) pourquoi...
Parce que c'est interdit dans le standard.
9.5 Unions
[...]
An object of a class with a nontrivial constructor (12.1), a nontrivial
copy constructor (12.8), a nontrivial destructor (12.4), or a nontrivial
copy assignment operator (13.5.3, 12.8) cannot be a member of a union,
or can an array of such objects.
Je suppose que c'est parce qu'il ne serait pas évident pour le
compilateur d'appeller les bonnes fonction :
union U
{
A a;
B b;
C c;
};
void (f)
{
U u;
if (b) // b étant une variable tappée au clavier par l'utilisateur
{
u.a = ...
}
else
{
u.b = ...
}
// 100000 lignes de code
u.c = ...
// Ici, le compilateur doit appeler le destructeur de A ou celui de B
en fonction de ce que l'utilisateur a tappé au clavier...
}
C'est un bon exemple, ca aide a comprendre.
Mais si aucun des destructeurs n'est defini (c'est a dire que l'on se
contente du destructeur par defaut) cela ne semblerait pas poser trop de
problemes.
"Loïc Joly" a écrit dans le message de news: bj8au2$7vv$
Fred wrote:
je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union { Vector3f v3f; Vector4f v4f; } }
Mon compilateur rejette une telle definition car Vector3f et Vector4f ont
des "copy constructor". Je ne comprends pas (encore:-) pourquoi...
Parce que c'est interdit dans le standard.
9.5 Unions [...] An object of a class with a nontrivial constructor (12.1), a nontrivial copy constructor (12.8), a nontrivial destructor (12.4), or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, or can an array of such objects.
Je suppose que c'est parce qu'il ne serait pas évident pour le compilateur d'appeller les bonnes fonction :
union U { A a; B b; C c; };
void (f) { U u; if (b) // b étant une variable tappée au clavier par l'utilisateur { u.a = ... } else { u.b = ... } // 100000 lignes de code u.c = ... // Ici, le compilateur doit appeler le destructeur de A ou celui de B en fonction de ce que l'utilisateur a tappé au clavier... }
C'est un bon exemple, ca aide a comprendre. Mais si aucun des destructeurs n'est defini (c'est a dire que l'on se contente du destructeur par defaut) cela ne semblerait pas poser trop de problemes.
Merci
Christophe Lephay
"Julien Blanc" a écrit dans le message de news:3f581e72$0$26406$
qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition précise à ce sujet ?
Un constructeur trivial est un constructeur qui n'utilise que des constructeurs triviaux pour initialiser ses membres ;)
Sérieusement, je ne sais plus quelle est la définition. Les constructeurs que génèrent le compilo sont qualifiés de "triviaux", mais je ne suis pas sur qu'un constructeur user-defined ne puisse pas être qualifié de trivial non plus...
Je dirais qu'un constructeur trivial est un constructeur qui ne comporte qu'une liste d'initialisation, avec un corps vide, mais vu tout ce qu'on peut faire dans la liste d'initialisation, il se peut que cette définition ne soit pas exacte...
Chris
"Julien Blanc" <Julien.Blanc@imag.fr> a écrit dans le message de
news:3f581e72$0$26406$626a54ce@news.free.fr...
qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition
précise à ce sujet ?
Un constructeur trivial est un constructeur qui n'utilise que des
constructeurs triviaux pour initialiser ses membres ;)
Sérieusement, je ne sais plus quelle est la définition. Les constructeurs
que génèrent le compilo sont qualifiés de "triviaux", mais je ne suis pas
sur qu'un constructeur user-defined ne puisse pas être qualifié de trivial
non plus...
Je dirais qu'un constructeur trivial est un constructeur qui ne comporte
qu'une liste d'initialisation, avec un corps vide, mais vu tout ce qu'on
peut faire dans la liste d'initialisation, il se peut que cette définition
ne soit pas exacte...
"Julien Blanc" a écrit dans le message de news:3f581e72$0$26406$
qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition précise à ce sujet ?
Un constructeur trivial est un constructeur qui n'utilise que des constructeurs triviaux pour initialiser ses membres ;)
Sérieusement, je ne sais plus quelle est la définition. Les constructeurs que génèrent le compilo sont qualifiés de "triviaux", mais je ne suis pas sur qu'un constructeur user-defined ne puisse pas être qualifié de trivial non plus...
Je dirais qu'un constructeur trivial est un constructeur qui ne comporte qu'une liste d'initialisation, avec un corps vide, mais vu tout ce qu'on peut faire dans la liste d'initialisation, il se peut que cette définition ne soit pas exacte...
| "Julien Blanc" a écrit dans le message de | news:3f581e72$0$26406$ | > qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition | > précise à ce sujet ?
Yep.
| Sérieusement, je ne sais plus quelle est la définition. Les constructeurs | que génèrent le compilo sont qualifiés de "triviaux", mais je ne suis pas | sur qu'un constructeur user-defined ne puisse pas être qualifié de trivial | non plus...
si le constructeur est defini par l'utilisateur, alors il n'est pas trivial. Par définition. :-)
12.1/5 [...] A constructor is trivial if it is an implicitly-declared default constructor and if: -- its class has no virtual functions (10.3) and no virtual base classes (10.1), and
-- all the direct base classes of its class have trivial constructors, and
-- for all the nonstatic data members of its class that are of class type (or array thereof), each such class has a trivial constructor.
| "Julien Blanc" <Julien.Blanc@imag.fr> a écrit dans le message de
| news:3f581e72$0$26406$626a54ce@news.free.fr...
| > qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition
| > précise à ce sujet ?
Yep.
| Sérieusement, je ne sais plus quelle est la définition. Les constructeurs
| que génèrent le compilo sont qualifiés de "triviaux", mais je ne suis pas
| sur qu'un constructeur user-defined ne puisse pas être qualifié de trivial
| non plus...
si le constructeur est defini par l'utilisateur, alors il n'est pas
trivial. Par définition. :-)
12.1/5
[...] A constructor is trivial if it is an implicitly-declared
default constructor and if:
-- its class has no virtual functions (10.3) and no virtual base
classes (10.1), and
-- all the direct base classes of its class have trivial
constructors, and
-- for all the nonstatic data members of its class that are of class
type (or array thereof), each such class has a trivial
constructor.
| "Julien Blanc" a écrit dans le message de | news:3f581e72$0$26406$ | > qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition | > précise à ce sujet ?
Yep.
| Sérieusement, je ne sais plus quelle est la définition. Les constructeurs | que génèrent le compilo sont qualifiés de "triviaux", mais je ne suis pas | sur qu'un constructeur user-defined ne puisse pas être qualifié de trivial | non plus...
si le constructeur est defini par l'utilisateur, alors il n'est pas trivial. Par définition. :-)
12.1/5 [...] A constructor is trivial if it is an implicitly-declared default constructor and if: -- its class has no virtual functions (10.3) and no virtual base classes (10.1), and
-- all the direct base classes of its class have trivial constructors, and
-- for all the nonstatic data members of its class that are of class type (or array thereof), each such class has a trivial constructor.
12.1/6 Otherwise, the constructor is non-trivial.
-- Gaby
--=-=-=--
kanze
Julien Blanc wrote in message news:<3f581e72$0$26406$...
Loïc Joly wrote:
Parce que c'est interdit dans le standard.
9.5 Unions [...] An object of a class with a nontrivial constructor (12.1), a nontrivial copy constructor (12.8), a nontrivial destructor (12.4), or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, or can an array of such objects.
qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition précise à ce sujet ?
Oui. Intuitivement, c'est une fonction sans code, ou dans le cas des copy, une copie bit-à-bit. Formellement, la fonction est trivielle si elle n'est pas declarée par le programmeur, et que la classe n'a pas de fonctions virtuelles, ni de bases virtuelles, et que la même fonction est trivielle dans toutes les classes de base et tous les variables non-statiques membres. (En gros. En fait, un destructeur peut être trivial même si la classe a des fonctions vituelles ou des bases virtuelles.)
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Julien Blanc <Julien.Blanc@imag.fr> wrote in message
news:<3f581e72$0$26406$626a54ce@news.free.fr>...
Loïc Joly wrote:
Parce que c'est interdit dans le standard.
9.5 Unions
[...]
An object of a class with a nontrivial constructor (12.1), a
nontrivial copy constructor (12.8), a nontrivial destructor (12.4),
or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a
member of a union, or can an array of such objects.
qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une
définition précise à ce sujet ?
Oui. Intuitivement, c'est une fonction sans code, ou dans le cas des
copy, une copie bit-à-bit. Formellement, la fonction est trivielle si
elle n'est pas declarée par le programmeur, et que la classe n'a pas de
fonctions virtuelles, ni de bases virtuelles, et que la même fonction
est trivielle dans toutes les classes de base et tous les variables
non-statiques membres. (En gros. En fait, un destructeur peut être
trivial même si la classe a des fonctions vituelles ou des bases
virtuelles.)
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Julien Blanc wrote in message news:<3f581e72$0$26406$...
Loïc Joly wrote:
Parce que c'est interdit dans le standard.
9.5 Unions [...] An object of a class with a nontrivial constructor (12.1), a nontrivial copy constructor (12.8), a nontrivial destructor (12.4), or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, or can an array of such objects.
qu'est-ce que la norme entend par "nontrivial" ? Y'a-t-il une définition précise à ce sujet ?
Oui. Intuitivement, c'est une fonction sans code, ou dans le cas des copy, une copie bit-à-bit. Formellement, la fonction est trivielle si elle n'est pas declarée par le programmeur, et que la classe n'a pas de fonctions virtuelles, ni de bases virtuelles, et que la même fonction est trivielle dans toutes les classes de base et tous les variables non-statiques membres. (En gros. En fait, un destructeur peut être trivial même si la classe a des fonctions vituelles ou des bases virtuelles.)
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
kanze
"Fred" wrote in message news:<bj9f28$jd9$...
"Loïc Joly" a écrit dans le message de news: bj8au2$7vv$
Fred wrote:
je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union { Vector3f v3f; Vector4f v4f; } }
Mon compilateur rejette une telle definition car Vector3f et Vector4f ont des "copy constructor". Je ne comprends pas (encore:-) pourquoi...
Parce que c'est interdit dans le standard.
9.5 Unions [...] An object of a class with a nontrivial constructor (12.1), a nontrivial copy constructor (12.8), a nontrivial destructor (12.4), or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, or can an array of such objects.
Je suppose que c'est parce qu'il ne serait pas évident pour le compilateur d'appeller les bonnes fonction :
union U { A a; B b; C c; };
void (f) { U u; if (b) // b étant une variable tappée au clavier par l'utilisateur { u.a = ... } else { u.b = ... } // 100000 lignes de code u.c = ... // Ici, le compilateur doit appeler le destructeur de A ou celui de B en fonction de ce que l'utilisateur a tappé au clavier... }
C'est un bon exemple, ca aide a comprendre. Mais si aucun des destructeurs n'est defini (c'est a dire que l'on se contente du destructeur par defaut) cela ne semblerait pas poser trop de problemes.
Il a parlé des destructeurs à titre d'exemple. Comment faire pour construire l'union, si un ou plusieurs membres ont un constructeur par défaut non trivial ? Comment faire pour la copier si un ou plusieurs membres ont un constructeur de copie non trivial ? Comment faire pour l'affecter si un ou plusieurs membres on un opérateur d'affectation non trivial ?
Si tu régardes les définitions des constructeurs et al. trivaux, tu verras qu'elles correspondent très exactement à ce qu'on peut faire avec un no-op, ou dans les cas des copies, avec memcpy. Sans en savoir plus sur le contenu.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
"Fred" <no.spam@spam.no> wrote in message
news:<bj9f28$jd9$1@news-reader1.wanadoo.fr>...
"Loïc Joly" <loic.actarus.joly@wanadoo.fr> a écrit dans le message de
news: bj8au2$7vv$1@news-reader2.wanadoo.fr...
Fred wrote:
je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union {
Vector3f v3f;
Vector4f v4f;
}
}
Mon compilateur rejette une telle definition car Vector3f et
Vector4f ont des "copy constructor". Je ne comprends pas
(encore:-) pourquoi...
Parce que c'est interdit dans le standard.
9.5 Unions
[...]
An object of a class with a nontrivial constructor (12.1), a
nontrivial copy constructor (12.8), a nontrivial destructor (12.4),
or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a
member of a union, or can an array of such objects.
Je suppose que c'est parce qu'il ne serait pas évident pour le
compilateur d'appeller les bonnes fonction :
union U
{
A a;
B b;
C c;
};
void (f)
{
U u;
if (b) // b étant une variable tappée au clavier par l'utilisateur
{
u.a = ...
}
else
{
u.b = ...
}
// 100000 lignes de code
u.c = ...
// Ici, le compilateur doit appeler le destructeur de A ou celui de B
en fonction de ce que l'utilisateur a tappé au clavier...
}
C'est un bon exemple, ca aide a comprendre. Mais si aucun des
destructeurs n'est defini (c'est a dire que l'on se contente du
destructeur par defaut) cela ne semblerait pas poser trop de
problemes.
Il a parlé des destructeurs à titre d'exemple. Comment faire pour
construire l'union, si un ou plusieurs membres ont un constructeur par
défaut non trivial ? Comment faire pour la copier si un ou plusieurs
membres ont un constructeur de copie non trivial ? Comment faire pour
l'affecter si un ou plusieurs membres on un opérateur d'affectation non
trivial ?
Si tu régardes les définitions des constructeurs et al. trivaux, tu
verras qu'elles correspondent très exactement à ce qu'on peut faire avec
un no-op, ou dans les cas des copies, avec memcpy. Sans en savoir plus
sur le contenu.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
"Loïc Joly" a écrit dans le message de news: bj8au2$7vv$
Fred wrote:
je souaiterais creer une classe qui aurait cette "allure"
class Variant {
union { Vector3f v3f; Vector4f v4f; } }
Mon compilateur rejette une telle definition car Vector3f et Vector4f ont des "copy constructor". Je ne comprends pas (encore:-) pourquoi...
Parce que c'est interdit dans le standard.
9.5 Unions [...] An object of a class with a nontrivial constructor (12.1), a nontrivial copy constructor (12.8), a nontrivial destructor (12.4), or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, or can an array of such objects.
Je suppose que c'est parce qu'il ne serait pas évident pour le compilateur d'appeller les bonnes fonction :
union U { A a; B b; C c; };
void (f) { U u; if (b) // b étant une variable tappée au clavier par l'utilisateur { u.a = ... } else { u.b = ... } // 100000 lignes de code u.c = ... // Ici, le compilateur doit appeler le destructeur de A ou celui de B en fonction de ce que l'utilisateur a tappé au clavier... }
C'est un bon exemple, ca aide a comprendre. Mais si aucun des destructeurs n'est defini (c'est a dire que l'on se contente du destructeur par defaut) cela ne semblerait pas poser trop de problemes.
Il a parlé des destructeurs à titre d'exemple. Comment faire pour construire l'union, si un ou plusieurs membres ont un constructeur par défaut non trivial ? Comment faire pour la copier si un ou plusieurs membres ont un constructeur de copie non trivial ? Comment faire pour l'affecter si un ou plusieurs membres on un opérateur d'affectation non trivial ?
Si tu régardes les définitions des constructeurs et al. trivaux, tu verras qu'elles correspondent très exactement à ce qu'on peut faire avec un no-op, ou dans les cas des copies, avec memcpy. Sans en savoir plus sur le contenu.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16