Pas de.
Le langage C++ spécification jamais fait la simple affirmation que l'on vous demande. Il ne dit pas n'importe où dans la langue standard que "tous les objets temporaires sont rvalues". En outre, la question elle-même est un peu mal choisi, puisque la propriété d'être une rvalue dans le langage C++ n'est pas une propriété d'un objet, mais plutôt une propriété d'une expression (c'est à dire une propriété de son résultat). C'est en fait la façon dont il est défini dans la spécification du langage: pour les différents types d'expressions, on dit que quand le résultat est une lvalue et quand c'est une rvalue. Entre autres choses, cela signifie en fait qu'un objet temporaire peut être consulté en tant que rvalue ainsi qu'une lvalue, en fonction de la forme de l'expression qui est utilisée pour effectuer l'accès.
Par exemple, le résultat de littéral 2 + 3
expression est évidemment une rvalue, temporaire de type int
. Nous ne pouvons pas appliquer le unaire &
depuis unaire &
nécessite une lvalue que son opérande
&(2 + 3); // ERROR, lvalue required
Cependant, comme nous le savons tous, une référence constante peut être attaché à un objet temporaire, comme dans
const int &ri = 2 + 3;
Dans ce cas, la référence est attaché temporaire, l'extension de la durée de vie de ce dernier. Évidemment, une fois que c'est fait, nous avons accès à cette même temporaire comme une lvalue ri
, puisque les références sont toujours lvalues. Par exemple, nous pouvons facilement et légalement s'appliquer unaire &
de la référence et obtenir un pointeur temporaire
const int *pi = &ri;
avec le pointeur reste parfaitement valable aussi longtemps que le temporaire persiste.
Un autre exemple évident de la lvalue l'accès à un objet temporaire est lorsque nous avons accès à un objet temporaire de type de classe par le biais de son this
pointeur. Le résultat de l' *this
est une lvalue (comme c'est toujours le cas avec le résultat de l'unaire *
appliqué à un pointeur de données), mais il ne change pas le fait que l'objet réel pourrait facilement être une mesure temporaire. Pour une classe donnée de type T
, de l'expression, T()
est une rvalue, comme il est dit explicitement dans la langue standard, mais l'objet temporaire accessible par *T().get_this()
d'expression (avec l'évidente mise en œuvre de l' T::get_this()
) est une lvalue. Contrairement à l'exemple précédent, cette méthode vous permet d'obtenir immédiatement un non-const-qualifiés lvalue, qui se réfère à un objet temporaire.
Donc, encore une fois, le même objet temporaire peut facilement être "vu" comme une rvalue ou comme une lvalue, selon le type de l'expression (quel type de chemin d'accès) que vous utilisez pour "regarder" à l'objet.