Je suis en train de vivre une erreur de compilation lors de la tentative d'utiliser un pointeur vers les données de membre lors de l'inclusion de l'espace de noms global qualificatif sur la struct. J'ai réduit mon code pour la suivante, ce qui fonctionne:
namespace foo {
using sausage = int;
struct bar { sausage baz; };
}
auto chuckle(foo::bar barry, ::foo::sausage foo::bar::*paul) {
return barry.*paul;
}
int main() {
return chuckle(foo::bar{5}, &foo::bar::baz);
}
Si j'ajoute maintenant l'espace de noms global qualificatif pour l' bar
struct dans l'argument d' chuckle
:
auto chuckle(foo::bar barry, ::foo::sausage ::foo::bar::*paul) {
// ^~ added ::
return barry.*paul;
}
...alors, il n'est plus compile et échoue avec l'erreur suivante:
10 : <source>:10:37: error: 'foo::sausage' is not a class, namespace, or enumeration
auto chuckle(foo::bar barry, ::foo::sausage ::foo::bar::*paul) {
^~~~~~~
10 : <source>:10:57: error: expected identifier before '*' token
auto chuckle(foo::bar barry, ::foo::sausage ::foo::bar::*paul) {
^
<source>: In function 'auto chuckle(foo::bar, int*)':
11 : <source>:11:17: error: 'paul' cannot be used as a member pointer, since it is of type 'int*'
return barry.*paul;
^~~~
<source>: In function 'int main()':
15 : <source>:15:45: error: cannot convert 'foo::sausage foo::bar::* {aka int foo::bar::*}' to 'int*' for argument '2' to 'auto chuckle(foo::bar, int*)'
return chuckle(foo::bar{5}, &foo::bar::baz);
^
Je vois ce comportement à l'échelle MSVC, Bruit et de la GCC.
J'ai mis deux exemples sur Godbolt:
Questions
a) Pourquoi l'ajout de l'espace de noms global qualificatif cause de la compilation à l'échec?
b) Est-il une raison à cela dans la spécification du langage?