10 votes

Quel est le résultat correct de decltype( (A{}.int_member) ) ?

Étant donné la définition du type A :

struct A { int i; };

Selon le cahier des charges [expr.ref] (J'ai utilisé n4618 ) :

(si E2 est non référencée,) ...Si E1 est une lvalue, alors E1.E2 est une lvalue ; sinon E1.E2 est un xvalue ...

évidemment A{}.i est xvalue ; étant donné également que [dcl.type.simple] :

(pour decltype(e) ,) - ... si e est un sans parenthèse ou une expression d'identification sans parenthèse accès aux membres de la classe... - sinon si e est un xvalue , decltype(e) est T&& où T est le type de e

donc, decltype( ( A{}.i ) ) donne lieu à int&& .

Cependant, j'ai essayé GCC5.1 et Clang3.9, qui donnent les résultats suivants int tandis que vs2015u3 donne int&& . Lequel est correct ?

4voto

Columbo Points 11661

int&& est correct.

La formulation que vous avez citée dans [expr.ref] a été modifiée il y a quelques années par la Commission européenne. cwg 616 et n'a pas été immédiatement adoptée par les implémentations ; voir ma réponse. aquí . En fait, les compilateurs devaient adopter simultanément le DR 616 et le document sur les expressions temporaires, sinon ils cassaient le code dans lequel l'extension de la durée de vie d'un objet, où nous lions une référence à l'expression temporaire de l'objet, n'était pas possible. membre est nécessaire. Dans l'ancien modèle d'implémentations, seules les prvalues pouvaient désigner des objets pour lesquels l'extension de la durée de vie est viable (bien qu'une telle exigence n'existait pas dans la formulation comme l'a souligné Johannes, c'était une formulation vague avant N3918, donc ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X