Question

J'ai été codage en C++ pour les quelques dernières années.Mais il y a une question que je n'ai pas été en mesure de comprendre.Je veux poser, sont tous temporaires en C++, rvalues?

Si non, quelqu'un peut-il me donner un exemple où temporaires produites dans le code est un lvalue?

Était-ce utile?

La solution

Non.

La spécification du langage C ++ ne fait jamais une affirmation aussi simple que celle que vous demandez. Il ne dit nulle part dans la norme linguistique que "tous les objets temporaires sont des relations". De plus, la question elle-même est un peu inappropriée, car la propriété d'être une valeur dans la langue C ++ n'est pas une propriété d'un objet, mais plutôt une propriété d'expression (c'est-à-dire une propriété de son résultat). C'est en fait comment il est défini dans la spécification linguistique: pour différents types d'expressions, il est dit que lorsque le résultat est un LVALUE et quand il s'agit d'une échelle. Entre autres choses, cela signifie en fait qu'un objet temporaire est accessible en tant que RValue ainsi que comme un LVALUE, en fonction de la forme d'expression spécifique qui est utilisée pour effectuer l'accès.

Par exemple, le résultat du littéral 2 + 3 L'expression est évidemment une valeur, un temporaire de type int. Nous ne pouvons pas appliquer l'UNARY & à ça depuis unary & nécessite une lvalue comme opérande

&(2 + 3); // ERROR, lvalue required

Cependant, comme nous le savons tous, une référence constante peut être attachée à un objet temporaire, comme dans

const int &ri = 2 + 3;

Dans ce cas, la référence est attachée au temporaire, prolongeant la durée de vie de ce dernier. De toute évidence, une fois terminé, nous avons accès à ce même temps temporaire qu'un lvalue ri, puisque les références sont toujours des LV. Par exemple, nous pouvons appliquer facilement et légalement & à la référence et obtenir un pointeur vers le temporaire

const int *pi = &ri;

avec ce pointeur restant parfaitement valable tant que le temporaire persiste.

Un autre exemple évident de l'accès à la valeur this aiguille. Le résultat de *this est une lvalue (comme c'est toujours le cas avec le résultat de * Appliqué à un pointeur de données), mais il ne change pas le fait que l'objet réel pourrait facilement être temporaire. Pour un type de classe donné T, expression T() est une valeur, comme indiqué explicitement dans la norme linguistique, mais l'objet temporaire accessible à *T().get_this() Expression (avec la mise en œuvre évidente de T::get_this()) est un lvalue. Contrairement à l'exemple précédent, cette méthode vous permet d'obtenir immédiatement un LValue non qualifié non-qualifié, qui fait référence à un objet temporaire.

Ainsi, encore une fois, le même objet temporaire peut facilement être "considéré" Chemin d'accès) Vous utilisez pour "regarder" cet objet.

Autres conseils

Prasoon Saurav a déjà lié un très bon fil CLC ++. Là-bas, James Kanze explique pourquoi la question n'a pas vraiment de sens. Cela se résume à:

  • Rvalue-ness est une propriété (booléenne) des expressions - chaque expression est soit une lvalue, soit un rvalue
  • Les temporaires sont ne pas expressions

Pour cette raison, la question n'a pas de sens.

Un bon exemple est le code suivant:

int main() {
  const int& ri = 4;
  std::cout << ri << std::endl; 
}

L'INT temporaire avec valeur 4 n'est pas une expression. L'expression ri qui est imprimé n'est pas temporaire. C'est un lvalue, et fait référence à un temporaire.

Eh bien, cet opérateur de tableau renvoie une référence, toute fonction qui renvoie une référence pourrait être considérée comme faire la même chose? Toutes les références sont constantes, bien qu'elles puissent être des LVAlues, ils modifient ce qu'ils font référence, pas la référence elle-même. La même chose est vraie pour le *opérateur,

*(a temp pointer) = val;

Je jure que j'avais l'habitude d'utiliser un compilateur qui passerait des valeurs temporaires à toute fonction qui a pris une référence,

Alors tu pourrais y aller:

int Afunc()
{
   return 5;
}

int anotherFunc(int & b)
{
    b = 34;
}


anotherFunc(Afunc());

Impossible de trouver un qui vous permet de le faire maintenant, la référence doit être constante afin de permettre le passage des valeurs temporaires.

int anotherFunc(const int & b);

Quoi qu'il en soit, les références peuvent être des LVAlues et temporaires, l'astuce étant la référence qu'il est soi n'est pas modifiée, seulement ce qu'elle fait référence.

Si vous comptez le-> L'opérateur en tant qu'opérateur, les pointeurs temporaires peuvent être des LVAlues, mais la même condition s'applique, ce n'est pas le pointeur temporaire qui serait changé, mais la chose à laquelle il pointe.

Une opération d'indexation du tableau est à la fois temporaire et un LVALUE, quelque chose comme un [10] = 1 est un exemple de ce que vous recherchez; Le LVALUE est un pointeur temporaire et calculé.

Réponse courte:oui, mais je ne vais pas citer la norme, parce que prouver le point serait nécessaire de résoudre tous les types de temporaire, il est.Par définition temporaire a une durée de vie d'un énoncé, de sorte que l'attribution des choses à l'un serait le style pauvres au mieux.

Réponse intéressante:Copie élision peut faire (en fait souvent) un objet temporaire identique avec une lvalue objet.Par exemple,

MyClass blah = MyClass( 3 ); // temporary likely to be optimized out

ou

return MyClass( 3 ); // likely to directly initialize object in caller's frame

Edit: comme pour la question de savoir si il n'y a aucun objet temporaire dans ces cas, §12.8/15 mentionne

l'opération de copie peut être omis, par la construction de l'objet temporaire directement dans la cible de l'omis de copier

ce qui pourrait indiquer qu'il y est un objet temporaire qui peut être identique avec une lvalue.

SharePoint Designer fournit une collection d'actions de flux de travail disponibles via l'interface utilisateur du concepteur de Workflow (UI). Bien que la gamme d'actions de flux de travail incluses dans SharePoint Designer soit étendue, elle est néanmoins finie. Dans certains cas, vous devrez peut-être modéliser un processus métier dont les exigences ne sont pas remplies par la bibliothèque existante des actions de workflow disponibles dans SharePoint Designer.

Vous pouvez regarder les liens ci-dessous,

Meilleures pratiques pour la création de coutume Activités à SharePoint 2010

Activités utiles sur le flux de travail sur mesure SharePoint Designer. -> dans ce que vous pouvez utiliser "Envoyer Email avec l'activité de fixation de fichier HTTP "-> Cette activité permet d'envoyer des courriels avec des pièces jointes récupérées à l'aide d'une demande Web. Exécution du rapport sur les services de rapport et l'envoyer comme une pièce jointe du flux de travail SPD serait un tel exemple. La demande d'URL est entièrement personnalisable et peut inclure des variables de flux de travail. Les demandes HTTP et HTTPS sont prises en charge. .

SharePoint 2010: Créez une activité de flux de travail à l'aide de Visual Studio 2010

Activités personnalisées SharePoint Designer pour SharePoint 2010.

Comment créer une action personnalisée pour un flux de travail?

Si non, quelqu'un peut-il me fournir un exemple où Temporary produit dans le code est un LVALUE?

Le code suivant lie une référence constante à un objet temporaire de type const float Créé par le compilateur:

int i;
const float &cfr = i;

Le comportement est "comme si":

int i;
const float __tmp_cfr = i; // introduced by the compiler
const float &cfr = __tmp_cfr;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top