Déclaration de méthode decltype dans la classe: erreur lorsqu’elle est utilisée avant que le membre «référencé» soit déclaré

Considérons le code suivant :

struct test { auto func() -> decltype(data) {} // ERROR int data; }; int main() { test t; t.func(); } 

Cela donne l’erreur suivante:

 main.cpp:2:29: error: 'data' was not declared in this scope auto func() -> decltype(data) {} 

Cependant, si je place les data au-dessus de func() , cela ne génère aucune erreur ( code live ):

 struct test { int data; auto func() -> decltype(data) {} }; ... 

Et donc ma question est la suivante: pourquoi decltype ne considère- decltype pas que les membres sont déclarés après (quand decltype est utilisé dans une déclaration de méthode, pas dans la définition)? Je souhaite également savoir s’il existe un quelconque changement dans ce comportement lors de futures itérations de la norme de langage.


Veuillez noter que je pose cette question parce que je m’attendais à decltype que decltype se comporte différemment. Ma convention de codage consiste à placer les membres de données de classe sous les fonctions de classe. Ce comportement différent affecterait sûrement la façon dont j’organise les membres de ma classe. Je vous serais très reconnaissant de bien vouloir fournir toute solution permettant de préserver ma convention de codage.

Le type de retour de fin fait partie de la déclaration de fonction de membre, qui n’a pas access aux membres de données ni aux fonctions de membre déclarées après, contrairement à la définition de la fonction de membre qui le fait. Je ne suis au courant d’aucun changement dans ce comportement en C ++ 14.

Voir 3.4.1-7 de la norme C ++ 11, Recherche de nom non qualifiée :

Un nom utilisé dans la définition d’une classe X en dehors d’un corps de fonction membre ou d’une définition de classe nestede doit être déclaré de l’une des manières suivantes:

  • avant son utilisation en classe X ou appartenir à une classe de base de X (10.2), ou …

(c’est moi qui souligne)