33 votes

les rvalues hors classe ont toujours des types non qualifiés cv

La section 9 du § 3.10 dit "les rvalues hors classe ont toujours des types cv-non qualifiés". Cela m'a fait me demander ...

 int foo()
{
    return 5;
}

const int bar()
{
    return 5;
}

void pass_int(int&& i)
{
    std::cout << "rvalue\n";
}

void pass_int(const int&& i)
{
    std::cout << "const rvalue\n";
}

int main()
{
    pass_int(foo()); // prints "rvalue"
    pass_int(bar()); // prints "const rvalue"
}
 

Selon la norme, il n'existe pas de valeur constante pour les types non-classes, mais bar() préfère se lier à const int&& . Est-ce un bug du compilateur?

EDIT: Apparemment, this est aussi une valeur constante :)

EDIT: Ce problème semble être résolu dans g ++ 4.5.0, les deux lignes affichent "rvalue" maintenant.

11voto

Jerry Coffin Points 237758

Le comité semble déjà être au courant qu'il y a un problème dans cette partie de la norme. GTC question 690 parle un peu le même problème avec la même partie de la norme (dans la "note complémentaire" à partir de septembre 2009). Je suppose nouvelle langue sera rédigée pour la partie de la norme bientôt.

Edit: j'ai juste remis un post sur comp.std.c++, en notant le problème et de proposer de nouvelles libellé de la question de la norme. Malheureusement, étant un groupe de discussion modéré, presque tout le monde aura probablement oublié cette question par le temps qu'il fait à travers l'approbation de la file d'attente il.

2voto

dirkgently Points 56879

Bon point. Je pense qu'il y a deux choses à regarder: 1) comme vous l'avez souligné la non-classe rvalue thingsy et 2) comment la résolution de surcharge fonctionne:

Les critères de sélection pour le meilleur la fonction sont le nombre d'arguments, comment bien les arguments correspondent à la paramètre de type-liste des candidats fonction, [...]

Je n'ai rien vu dans la norme qui me dit non-classe rvalues sont spécialement traités au cours de la résolution de surcharge.

Votre question est abordée dans le projet de la norme, j'ai si (N-4411) un peu:

Ce n'est cependant une lecture en parallèle de référence de liaison, la conversion implicite des séquences, des références, et de résolution de surcharge en général:

13.3.3.1.4 de Référence de liaison

2 Lorsqu'un paramètre de type de référence n'est pas lié directement à un argument l'expression, la conversion de la séquence est celui nécessaire à la conversion de l'argument de l'expression de la sous-jacentes la catégorie de référence selon pour 13.3.3.1.

et

13.3.3.2 Classement de la conversion implicite séquences

3 Deux la conversion implicite des séquences de la même forme se confondent conversion de séquences, à moins que l'un des règles suivantes s'appliquent:

- Conversion Standard de la séquence S1 est un meilleur taux de conversion de la séquence de standard
la conversion de la séquence S2 si

- S1 et S2 sont référence des liaisons (8.5.3) et ne se réfère à une implicite de l'objet en paramètre d'une non statiques membre de la fonction déclarée sans ref-qualificatif, et soit S1 lie un lvalue de référence pour une lvalue et S2 se lie référence rvalue ou S1 lie une rvalue référence à une rvalue et S2 lie une lvalue de référence.

[ Exemple:

int i;
int f();
int g(const int&);
int g(const int&&);
int j = g(i); // calls g(const int&)
int k = g(f()); // calls g(const int&&)

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