Bonjour,
J'ai beau lire la n2535 et la n1344, les inline namespace me semblent assez anecdotiques.
Effectivement, dans le code suivant, la différence de comportement pour l'appel de g peut surprendre :
Ne maîtrisant pas sur les doigts les name lookup et en particulier les argument-dependent name lookup, j'aurais de toute façon tendance à écrire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 namespace Lib { namespace Lib_1 { struct A{}; } struct B{}; template <typename T> void g(T){} } int main() { Lib::Lib_1::A a; g(a); // Erreur Lib::B b; g(b); // OK return 0; }
Ce code fonctionne sans problème. Et je pense que j'aurais toujours tendance à écrire ce dernier code plutôt que celui-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 namespace Lib { namespace Lib_1 { struct A{}; } struct B{}; template <typename T> void g(T){} } int main() { Lib::Lib_1::A a; Lib::g(a); Lib::B b; Lib::g(b); return 0; }
De la même façon, pour les spécialisations de template, j'écrirais plus volontiers la spécialisation dans l'espace de nom approprié :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 namespace Lib { inline namespace Lib_1 { struct A{}; } struct B{}; template <typename T> void g(T){} } int main() { Lib::Lib_1::A a; g(a); Lib::B b; g(b); return 0; }
qu'avec une association de nom :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 namespace Lib { namespace Lib_1 { template<class T> struct A{}; } struct B{}; namespace Lib_1 { template<> struct A<B>{}; } }
Du coup, je me demande si je ne passe pas à côté de quelque chose avec cette évolution. Je n'arrive pas à vraiment saisir son intérêt.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 namespace Lib { inline namespace Lib_1 { template<class T> struct A{}; } struct B{}; template<> struct A<B>{}; }
Qu'en pensez-vous ?
Partager