OVH Cloud OVH Cloud

instanciation paresseuse?

6 réponses
Avatar
ylegoc
En definissant comme ceci:

#include <iostream>

using namespace std;

class S
{
public:
inline S()
{
cout << "S()" << endl;
}
};

template<class T>
struct TA
{
inline void foo() const
{
cout << "TA<T>::foo()" << endl;
};

static S s;
};

template<class T>
S TA<T>::s = S();

int main(int argc, char **argv)
{
TA<int> t;
t.foo();
S const & s = t.s;

return 0;
}

Si la ligne "S const & s = t.s" est omise, alors TA<int>::s n'est pas
instanciee avec g++ 4.0. Que dit le standard sur l'instanciation
paresseuse de membre statique de classe template?

6 réponses

Avatar
Jean-Marc Bourguet
"ylegoc" writes:

Que dit le standard sur l'instanciation paresseuse de
membre statique de classe template?


14.7.1/1

Unless a class template specialization has been explicitly
instantiated (14.7.2) or explicitly specialized (14.7.3),
the class template specialization is implicitly instantiated
when the specialization is referenced in a context that
requires a completely-defined object type or when the
completeness of the class type affects the semantics of the
program. The implicit instantiation of a class template
specialization causes the implicit instantiation of the
declarations, but not of the definitions or default
arguments, of the class member functions, member classes,
static data members and member templates; and it causes the
implicit instantiation of the definitions of member
anonymous unions. Unless a member of a class template or a
member template has been explicitly instantiated or
explicitly specialized, the specialization of the member is
implicitly instantiated when the specialization is
referenced in a context that requires the member definition
to exist; in particular, the initialization (and any
associated side-effects) of a static data member does not
occur unless the static data member is itself used in a way
that requires the definition of the static data member to
exist.

Cela me semble clair, le comportement de g++ est celui
demandé par la norme.

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

Avatar
Olivier Miakinen

Que dit le standard sur l'instanciation paresseuse de
membre statique de classe template?


14.7.1/1

[ un texte tout en étranger ]


Comme la hiérarchie est francophone, j'ai utilisé babelfish pour essayer
d'y comprendre quelque chose. Le langage de destination est le français,
et apparemment c'est en choisissant « anglais » comme langue de départ
que le résultat comporte le plus de mots du Petit Larousse :

<http://babelfish.altavista.com/tr>
À moins qu'une classe que spécialisation de calibre a été explicitement
instantiated (14.7.2) ou se soit explicitement spécialisée (14.7.3), la
classe la spécialisation de calibre est instantiated implicitement quand
la spécialisation est mise en référence dans un contexte qui exige un
type complet-défini d'objet ou quand la perfection du type de classe
affecte la sémantique du programme. L'instantiation implicite d'une
spécialisation de calibre de classe cause l'instantiation implicite des
déclarations, mais pas des définitions ou des arguments de défaut, des
fonctions de membre de classe, des classes de membre, des membres de
données statiques et des calibres de membre ; et il cause
l'instantiation implicite des définitions des syndicats anonymes de
membre. À moins qu'un membre d'un calibre de classe ou un membre que le
calibre a été explicitement instantiated ou se soit explicitement
spécialisé, la spécialisation du membre soit instantiated implicitement
quand la spécialisation est mise en référence dans un contexte qui exige
de la définition de membre d'exister ; en particulier, l'initialisation
(et tous effets secondaires associés) d'un membre de données statiques
ne se produit pas à moins que le membre de données statiques lui-même
soit employé dans une manière dont exige de la définition du membre de
données statiques d'exister.
</>

Cela me semble clair,


Ah. Ben tant mieux pour toi. ;-)

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
kanze
Olivier Miakinen wrote:

Que dit le standard sur l'instanciation paresseuse de
membre statique de classe template?


14.7.1/1

[ un texte tout en étranger ]



On a démandé ce que disait la norme. Il a cité la norme. Ce
n'est pas sa faute que la norme n'existe pas en français.

Comme la hiérarchie est francophone, j'ai utilisé babelfish
pour essayer d'y comprendre quelque chose. Le langage de
destination est le français, et apparemment c'est en
choisissant « anglais » comme langue de départ


Je ne suis pas sûr que la langue de la norme soit réelement
anglais. C'est un langage assez spécialisé, avec des
significations parfois très particulières. En anglais, on dit
qu'elle est écrite en « standardese » (« normois » ?). Ce qui
fait qu'un outil de traduction conçu pour le langage général
risque d'en sortir des contrasens. Ce qui veut dire aussi qu'un
français, même un français qui connaît assez bien l'anglais,
pourrait aussi si méprendre. Et même un anglophone... il
reconnaîtra sans doute que certains mots apparaissent dans des
contextes assez peu habituels, d'où il pourrait conclure qu'il
ne comprend pas.

En fait, le passage cité est un des plus clair dans la norme ;
mais il faut quand même par exemple comprendre la distinction
« specialize »/« instantiate ». Mais il faut comprendre cette
distinction pour comprendre les templates en général, je crois.
Et je ne sais pas en ce qui concerne les vrais francophones,
mais moi, en français, j'utilise les mots « spécialiser » et
« instantier » (même si ce dernier ne se trouve pas dans mon
petit Robert).

que le résultat
comporte le plus de mots du Petit Larousse :


Le problème commence avec le mot template. Qui n'a pas, dans le
langage général, un véritable équivalent en français, ou plutôt,
dont l'équivalent dépend de l'emploi. (Dans l'emploi propre à
C++, je crois que générique est le mot approuvé. Mais j'utilise
volentiers template, et je me fais comprendre. Des mots du genre
générique ou modèle sont à mon avis trop générique ; j'utilise
générique pour expliquer le concepte, mais quand je parle du
structure C++, c'est bien un template (de même que c'est une
instruction « if » ou « while », et non une instruction « si »
ou « tantque »).

Que ça plaise ou non, une certaine connaissance de l'anglais
s'impose.

<http://babelfish.altavista.com/tr>


Qui n'arrive déjà pas très bien avec les textes en langage
courant. Ce n'est vraiment pas la pleine de lui lancer des
textes techniques.

[...]
Cela me semble clair,


Ah. Ben tant mieux pour toi. ;-)


Par rapport à la plupart de la norme, c'est très clair. À
condition, évidemment, de se rappeller que dans une norme,
chaque mot a une signification très précise.

--
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
kanze
Olivier Miakinen wrote:

Que dit le standard sur l'instanciation paresseuse de
membre statique de classe template?


14.7.1/1

[ un texte tout en étranger ]


Comme la hiérarchie est francophone,


Vue qu'on s'y plaigne, un petit essai de thème de ma part :

Au moins d'être instantiée explicitement ou spécialisée
explicitement, la spécialisation d'une classe générique est
instantiée implicitement quand on y fait référence dans un
contexte où il faut un type à définition complète ou que le
fait que le type soit complet a un effet sur la sémantique
du programme. L'instantiation implicite de la classe a comme
conséquence l'instantation implicite des declarations, mais
non les définitions ni les paramètres par défaut, ni des
fonctions membre de la classe, ni des classes membre, ni des
variables statiques membre, ni des classes et fonctions
génériques membre ; il provoque aussi l'instantation
implicite des définitions des unions anonyme que contient la
classe générique. Au moins d'être instantiée explicitement
ou spécialisée explicitement, un membre d'une classe
générique, ou un template que contient une classe générique,
la spécialisation du membre est instantiée implicitement
quand on y fait référence dans un contexte où il faut que la
définition du membre existe ; en particulier,
l'initialisation d'un variable statique membre n'a lieu que
si cette variable statique membre a servi elle-même d'une
façon telle que l'existance d'une définition en soit
nécessaire.

Ce n'est sûrement pas parfait, mais c'est sans doute mieux que
Babelfish.

--
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
Olivier Miakinen

Vue qu'on s'y plaigne, un petit essai de thème de ma part :

[traduction]

Ce n'est sûrement pas parfait, mais c'est sans doute mieux que
Babelfish.


Un grand merci pour cela. Je l'ai lu et relu plusieurs fois : je ne suis
pas sûr encore d'avoir tout compris, mais en tout cas c'est déjà plus
facile à lire pour un francophone.

Cordialement,
--
Olivier

Avatar
Loïc Joly

Le problème commence avec le mot template. Qui n'a pas, dans le
langage général, un véritable équivalent en français, ou plutôt,
dont l'équivalent dépend de l'emploi. (Dans l'emploi propre à
C++, je crois que générique est le mot approuvé. Mais j'utilise
volentiers template, et je me fais comprendre. Des mots du genre
générique ou modèle sont à mon avis trop générique ; j'utilise
générique pour expliquer le concepte, mais quand je parle du
structure C++, c'est bien un template (de même que c'est une
instruction « if » ou « while », et non une instruction « si »
ou « tantque »).


Personellement, je me méfie d'autant plus de générique que ce mot a un
sens avoisiné mais différent dans des langages comme C# ou Java.

--
Loïc