OVH Cloud OVH Cloud

const & sur les POD

34 réponses
Avatar
David F.
Bonjour,
je lis parfois le code suivant (un poste récent le montre d'ailleurs):

1. int fct( const INT& n );

au lieu d'un simple

2. int fct ( INT n );

L'argument pour la forme 1. est (à mon sens):
- elle force la vérification que n ne sera pas
modifiée à l'intérieur de fct.
- elle force un passage sans recopie de n
( plus génant pour un vrai objet)
- elle évité d'avoir à réfléchir si INT est un POD ou un objet
complexe et hésiter entre la forme 1. et 2.

Honnêtement, même si j'utilise la forme 2. pour les POD, et la 1.
pour les objets. J'ai du mal à donner des arguments contre la forme 1
(au delà de la lourdeur de la notation).

Cordialement.

4 réponses

1 2 3 4
Avatar
Gabriel Dos Reis
Franck Branjonneau writes:

| Gabriel Dos Reis écrivait:
|
| > Franck Branjonneau writes:
| >
| > | Gabriel Dos Reis écrivait:
| > |
| > | > Franck Branjonneau writes:
| > | >
| > | > | Comme tu lis mieux Gabriel que moi, je te renvoie à
| > | > | <news: et à
| > | > | <news: dernière phrase,
| > | > | c'est le sens de mon message.
| > | >
| > | > Le mot clé étant:
| > | >
| > | > # | C'est-à-dire une règle du "comme si" sans exception.
| > | >
| > | > # Ah, si tu veux une règle sans exception, tu peux considérer,
| > | > # *en pratique*, que le point 12.8/15 fait partie de la règle « comme
| > | > # si ».
| > | >
| > | > et la réalité est que la règle du « comme si » n'est pas comme
| > | > Arnaud le voudrait.
| > |
| > | Ton point est donc que 12.8/15 et as-if sont distincts mais
| > | suffisamment proche pour qu'en *pratique* ils ne soient pas
| > | distinguables ? Par suffisamment proche j'entends : 12.8/15 mets
| > | une contrainte implicite sur le constructeur de copie telle que si
| > | elle est respectée alors as-if est applicable.
| >
| > Essentiellement, oui.
|
| Alors, essentiellement, je ne comprends pas
|
| ,----
| | From: Gabriel Dos Reis
| | Message-ID:
| |
| | Franck Branjonneau writes:
| |
| | [...]
| |
| | | La régle du comme si permet l'élision de l'appel au constructeur de
| | | copie lorsqu'il est démontré qu'il n'avait pas d'effet(s) de
| | | bord. 12.8/15 est une démonstration.
| |
| | Non.
| |
| | -- Gaby
| `----
|
| La question du superflu reste ouverte...

(1) si on veut raisonner du point de vue formel de la norme, e.g si
tu veux par exemple porter plainte contre ton compilateur,
12.8/15 *n'est pas* une démonstration de la « as-if rule » comme
définit par la norme.

(2) si tout ce qui t'interesse, c'est une règle simple, pratique, tu
suivras en tant que programmeur, voir la réponse à Arnaud à
laquelle tu faisais allusion. Le mot clé étant *pratique*.

C'est plus clair ?

-- Gaby
Avatar
Franck Branjonneau
Gabriel Dos Reis écrivait:

Franck Branjonneau writes:

[...]



C'est plus clair ?


Je m'en satisferais. Merci.


Si tu as le temps de répondre à
<news:. Que je saches si je fais un
bug report.

--
Franck Branjonneau

Avatar
kanze
Franck Branjonneau wrote:
Franck Branjonneau écrivait:
Lis
<http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#20>
« When certain criteria are met, an implementation is
allowed to omit the copy construction of a class object
[...] This elision of copy operations is permitted in the
following circumstances (which may be combined to eliminate
multiple copies):

- in a return statement in a function with a class return type [...]
- when a temporary class object (12.2 class.temporary ) would be
copied to a class object with the same cv-unqualified type [...] »


L'élision de la copie n'est permise que si les types impliqués
sont les « same cv-unqualified type ». Est-ce que cela veut
dire que dans l'exemple suivant

class Thing {
public:
int count_;

Thing(): count_(0) {}
~Thing() {}
Thing(const Thing & other): count_(other.count_+1) {
std::clog << "Observablen";
}
};

Thing const f() {
Thing t;
return t;
}

int main() {

Thing t2 = f();
return t2.count_;
}

main() doit retourner 2 ?


Non. La valeur de rétour et t2 ont le même cv-unqualified type :
Thing. La valeur de rétour de main peut donc être 0, 1 ou 2.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Franck Branjonneau
"kanze" écrivait:

Franck Branjonneau wrote:

les « same cv-unqualified type »

Thing const
Thing


le même cv-unqualified type : Thing.


Merci James.

--
Franck Branjonneau


1 2 3 4