Basé sur Answer de @ songyuanyao, je remarquai que mon erreur vérifiait la mauvaise chose: Mon intention était de vérifier si le résultat i+j
se lierait à une référence rvalue, mais j'ai vérifié si est une référence rvalue.
decltype déduit du type basé sur la value category, ne se fonde pas sur ce que reference type la valeur serait se lient à:
1) si la catégorie de valeur de l'expression est xvalue
, decltype alors les rendements T&&
;
2) si la catégorie de valeur de l'expression est lvalue
, alors decltype donne T&
;
3) si la catégorie de valeur de l'expression est prvalue
, alors decltype donne T
.
Comme le montre la liste, depuis C++ 11, rvalues
n'existent pas comme une catégorie distincte sur le niveau le plus bas. Ils sont maintenant une catégorie composite contenant à la fois prvalues
ainsi que xvalues
. La question telle que écrite demande si l'expression est rvalue reference
et vérifie s'il s'agit d'un xvalue
.
De la liste ci-dessus, il est clair que i+j
est un prvalue
, donc le troisième cas s'applique. Ceci explique pourquoi decltype(i + j)
est int
et non int&&
. Les deux xvalues
et prvalues
se lient à références rvalue.
Donc, en vérifiant si i+j
se fixe à un lvalue reference
ou rvalue reference
confirme que, en effet, il se lie à un rvalue reference
:
void foo(const int& f)
{
std::cout << "binds to lvalue reference" << std::endl;
}
void foo(int&& f)
{
std::cout << "binds to rvalue reference" << std::endl;
}
void test(int i, int j)
{
foo(i); // lvalue -> lvalue ref
foo(std::move(i)); // xvalue -> rvalue ref
// (std::move converts the argument to a rvalue reference and returns it as an xvalue)
foo(i + j); // prvalue -> rvalue ref
}
En conclusion:i+j
est pas une référence rvalue , mais se lie à un.
Ce sont simplement des anciennes données. Je ne pense pas que vous pouvez std :: déplacer un int .. – 0xbaadf00d
Cela a toujours été int, depuis des temps immémoriaux (a.k.a. premiers Unix). Comment déplaceriez-vous '2 + 2'? – bipll
Vous pouvez beaucoup 'std :: move' un' int' et c'est d'ailleurs le point, l'OP pose une question sur la catégorie de valeur de 'i + j'. –