2010-10-11 16 views
3

Je publie un comp.std.c++ Usenet discussion ici parce que ce groupe est devenu très peu fiable. Les derniers articles que j'ai soumis sont passés dans le vide, et l'activité a pratiquement cessé. Je doute que j'ai été banni et/ou que tout le monde a perdu tout intérêt. Espérons que toutes les personnes intéressées trouveront cette discussion, et il y aura une migration générale. Peut-être alors ils vont nommer un nouveau modérateur.C++ 0x: opérateur conditionnel, xvalues ​​et decltype


Bonjour!

Avec mon interprétation actuelle de l'ébauche N3126 w.r.t. l'opérateur conditionnel et XValues, j'attends les affirmations suivantes à tenir:

int i = 0; 
int& j = true? i : i; 
int&& k = true? std::move(i) : std::move(i); // #2 
assert(&i == &j); // Holds since C++98 
assert(&i == &k); // Should this hold as well? 

5,16/4 dit:

Si les deuxième et troisième opérandes [à l'opérateur conditionnel] sont glvalues ​​de la même valeur et la catégorie ont le même type, le résultat est de cette catégorie de type et la valeur [...]

Cependant, il ne dit pas clairement que la valeur de glissement résultante fait référence à l'un des objets auxquels les opérandes de glgluture se réfèrent - ou est-ce implicite parce que sinon cela retournerait une prvalue? À l'aide de GCC 4.5.1 en mode C++ 0x la deuxième assertion échoue. La référence k semble se référer à un objet temporaire. Quelqu'un peut-il clarifier si le comder est autorisé à créer un tel temporaire dans le cas où les deux opérandes autour du côlon sont xvalues ​​du même type?

Je suppose actuellement que GCC est buggé et/ou pas à jour en ce qui concerne à xvalues.

La question de suivi est la suivante: ne serait-il pas agréable de pouvoir détecter la catégorie de valeur d'une expression? Si nous ignorons l'opérateur conditionnel , nous pouvons détecter la catégorie de valeur d'une expression avec decltype. Mais qu'est-ce que

bool xvalue = std::is_rvalue_reference< 
    decltype(true ? std::move(i) : std::move(i)) >::value; 

supposé céder? En utilisant GCC 4.5.1, la variable xvalue est initialisée avec false. Est-ce conforme au brouillon standard actuel?

TIA, Sebastian

+0

Je pense que vous voulez dire [comp.std.C++], comme le laisse entendre votre lien. Oui, il y a un peu de décalage mais je pense que vous venez de rencontrer un black-out Google récent. Avez-vous publié des messages via Google Groupes? –

+0

@Alf: Je publie des messages par Google Groupes, mais cela ne toucherait-il pas tous les groupes? Il n'y a pratiquement aucune activité sur comp.std.C++ depuis septembre, pas pour les groupes non modérés. – Potatoswatter

+0

D'ici, c.l.C++ a 30 messages pour mon "aujourd'hui" local, c.s.C++ en a deux (un de "SG", qui semble être vous), et cinq autres messages pour d'autres personnes ce mois-ci. – sbi

Répondre

2

Je pense que GCC est non conforme 4.5.1 WRT §5.16/4. Avez-vous filed a bug report?

Quoi qu'il en soit, je pense qu'il est conforme à ce code d'opérateur ternaire. decltype est définie par §7.1.6.2/4:

Le type désigné par decltype (e) est défini comme suit:

  • si e est un sans parenthèses id-expression ou un accès de membre de la classe (5.2.5), decltype (e) est le type de l'entité nommée par e.S'il n'y a pas d'entité , ou si e nomme un ensemble de fonctions surchargées , le programme est mal formé;
  • autrement, si e est un appel de fonction (5.2.2) ou une invocation d'un opérateur surchargé (parenthèses autour e sont ignorés), decltype (e) est le type de retour de la fonction statique choisie;
  • sinon, si e est une valeur l, le type déclaré (e) est T &, où T est le type de e;
  • sinon, decltype (e) est le type de e. L'opérande du spécificateur decltype est un opérande non évalué (Article 5).

decltype travaux en récupérant la déclaration appropriée et renvoyer le type désiré de celui-ci. Il a peu d'intelligence en ce qui concerne les opérateurs non surchargés. Peut-être un autre point

  • autrement, si e est un xvalue, decltype (e) est T&&, où T est le type de e

serait dans l'ordre, d'autant plus que, comme il est écrit, XValues ​​obtenir traité comme prvalues. De plus, votre expression correspond exactement à la définition de std::common_type (§20.7.6.6/3).

Une solution simple (selon une expression: Vp):

template< typename T1, typename T2 > 
struct common_type_and_category { 
    typedef typename std::conditional< 
     std::is_same< T1, T2 >::value, 
     T1, 
     typename std::common_type< T1, T2 >::type 
    >::type type; 
};