Le document n1905 dit concernant l'op=E9rateur virgule au =A75.18: "All
side effects (1.9) of the left expression, except for the destruction
of temporaries (12.2), are performed before the evaluation of the
right expression.".
Pourtant je constate le contraire avec g++ 4.5.2 avec le code suivant:
class A {
public:
int val;
A(const int& n) : val(n) {}
};
class B {
};
A operator , (A a, int* const n) {
*n =3D a.val;
std::cout << "n =3D " << *n << std::endl;
return a;
}
A operator , (A a, A b) {
std::cout << "(b % " << a.val << "), (b % " << b.val << ")" <<
std::endl;
return b;
}
A operator % (B b, int n) {
std::cout << "b % " << n << std::endl;
return A(n);
}
int main() {
B b;
int n =3D 1;
(b % n, b % 2, &n, b % n);
return 0;
}
qui donne le r=E9sultat:
b % 1
b % 2
b % 1
(b % 1), (b % 2)
n =3D 2
(b % 2), (b % 1)
C'est =E0 dire que l'expression la plus =E0 droite a =E9t=E9 =E9valu=E9e av=
ant
l'affectation de n juste =E0 gauche, contrairement =E0 la n1905.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jean-Marc Bourguet
Christophe DUVERGER writes:
Bonjour,
Le document n1905 dit concernant l'opérateur virgule au §5.18: "All side effects (1.9) of the left expression, except for the destruction of temporaries (12.2), are performed before the evaluation of the right expression.".
Ce paragraphe s'applique à la version définie par le langage, pas à ceux que tu définis toi-même; c'est le cas aussi pour && et || et c'est une raison pour lesquelles il faut réfléchir à plusieurs fois avant d'utiliser la possibilité de surcharge.
A+
-- Jean-Marc FAQ de fclc++: http://web.archive.org/web/*/http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Christophe DUVERGER <baxter150@gmail.com> writes:
Bonjour,
Le document n1905 dit concernant l'opérateur virgule au §5.18: "All
side effects (1.9) of the left expression, except for the destruction
of temporaries (12.2), are performed before the evaluation of the
right expression.".
Ce paragraphe s'applique à la version définie par le langage, pas à ceux
que tu définis toi-même; c'est le cas aussi pour && et || et c'est une
raison pour lesquelles il faut réfléchir à plusieurs fois avant d'utiliser
la possibilité de surcharge.
A+
--
Jean-Marc
FAQ de fclc++: http://web.archive.org/web/*/http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Le document n1905 dit concernant l'opérateur virgule au §5.18: "All side effects (1.9) of the left expression, except for the destruction of temporaries (12.2), are performed before the evaluation of the right expression.".
Ce paragraphe s'applique à la version définie par le langage, pas à ceux que tu définis toi-même; c'est le cas aussi pour && et || et c'est une raison pour lesquelles il faut réfléchir à plusieurs fois avant d'utiliser la possibilité de surcharge.
A+
-- Jean-Marc FAQ de fclc++: http://web.archive.org/web/*/http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Christophe DUVERGER
Ce paragraphe s'applique la version d finie par le langage, pas ceux que tu d finis toi-m me; c'est le cas aussi pour && et || et c'est une raison pour lesquelles il faut r fl chir plusieurs fois avant d'utiliser la possibilit de surcharge.
Toujours dans le document n1905, on peut lire au §13.5 - 6 : "It is not possible to change the precedence, grouping, or number of operands of operators.". Donc normalement, le comportement associatif de l'opérateur virgule devrait être conservé.
Christophe
Ce paragraphe s'applique la version d finie par le langage, pas ceux
que tu d finis toi-m me; c'est le cas aussi pour && et || et c'est une
raison pour lesquelles il faut r fl chir plusieurs fois avant d'utiliser
la possibilit de surcharge.
Toujours dans le document n1905, on peut lire au §13.5 - 6 : "It is
not possible to change the precedence, grouping, or number of operands
of operators.".
Donc normalement, le comportement associatif de l'opérateur virgule
devrait être conservé.
Ce paragraphe s'applique la version d finie par le langage, pas ceux que tu d finis toi-m me; c'est le cas aussi pour && et || et c'est une raison pour lesquelles il faut r fl chir plusieurs fois avant d'utiliser la possibilit de surcharge.
Toujours dans le document n1905, on peut lire au §13.5 - 6 : "It is not possible to change the precedence, grouping, or number of operands of operators.". Donc normalement, le comportement associatif de l'opérateur virgule devrait être conservé.
Christophe
Jean-Marc Bourguet
Christophe DUVERGER writes:
Ce paragraphe s'applique la version d finie par le langage, pas ceux que tu d finis toi-m me; c'est le cas aussi pour && et || et c'est une raison pour lesquelles il faut r fl chir plusieurs fois avant d'utiliser la possibilit de surcharge.
Ca ne parle pas de la presence ou non de points de sequencement. Les operateurs definis par l'utilisateur sont des fonctions comme les autres pour tout ce qui est semantique (ok, -> a un comportement particulier)
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Christophe DUVERGER <baxter150@gmail.com> writes:
Ce paragraphe s'applique la version d finie par le langage, pas ceux
que tu d finis toi-m me; c'est le cas aussi pour && et || et c'est une
raison pour lesquelles il faut r fl chir plusieurs fois avant d'utiliser
la possibilit de surcharge.
Ca ne parle pas de la presence ou non de points de sequencement. Les
operateurs definis par l'utilisateur sont des fonctions comme les autres
pour tout ce qui est semantique (ok, -> a un comportement particulier)
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Ce paragraphe s'applique la version d finie par le langage, pas ceux que tu d finis toi-m me; c'est le cas aussi pour && et || et c'est une raison pour lesquelles il faut r fl chir plusieurs fois avant d'utiliser la possibilit de surcharge.
Ca ne parle pas de la presence ou non de points de sequencement. Les operateurs definis par l'utilisateur sont des fonctions comme les autres pour tout ce qui est semantique (ok, -> a un comportement particulier)
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Christophe DUVERGER
Ca ne parle pas de la presence ou non de points de sequencement. Les operateurs definis par l'utilisateur sont des fonctions comme les autres pour tout ce qui est semantique (ok, -> a un comportement particulier)
Effectivement, §1.9 note 14: 14) "When one of these operators is overloaded (clause 13) in a valid context, thus designating a user- defined operator function, the expression designates a function invocation, and the operands form an argument list, without an implied sequence point between them." Et §8.3.6 - 9: "The order of evaluation of function arguments is unspecified."
Merci
Christophe
Ca ne parle pas de la presence ou non de points de sequencement. Les
operateurs definis par l'utilisateur sont des fonctions comme les autres
pour tout ce qui est semantique (ok, -> a un comportement particulier)
Effectivement, §1.9 note 14: 14) "When one of these operators is
overloaded (clause 13) in a valid context, thus designating a user-
defined operator function, the expression designates a function
invocation, and the operands form an argument list, without an implied
sequence point between them."
Et §8.3.6 - 9: "The order of evaluation of function arguments is
unspecified."
Ca ne parle pas de la presence ou non de points de sequencement. Les operateurs definis par l'utilisateur sont des fonctions comme les autres pour tout ce qui est semantique (ok, -> a un comportement particulier)
Effectivement, §1.9 note 14: 14) "When one of these operators is overloaded (clause 13) in a valid context, thus designating a user- defined operator function, the expression designates a function invocation, and the operands form an argument list, without an implied sequence point between them." Et §8.3.6 - 9: "The order of evaluation of function arguments is unspecified."