Frage

Ich habe in den letzten Jahren in C ++ programmiert.Aber es gibt eine Frage, die ich nicht herausfinden konnte.Ich möchte fragen, sind alle Provisorien in C ++, Werte?

Wenn nein, kann mir jemand ein Beispiel geben, in dem temporär im Code erzeugt wird wert?

War es hilfreich?

Lösung

NEIN.

Die C++-Sprachspezifikation macht niemals eine so einfache Aussage wie die, nach der Sie fragen.Im Sprachstandard steht nirgends, dass „alle temporären Objekte R-Werte sind“.Darüber hinaus ist die Frage selbst etwas irreführend, da die Eigenschaft, ein R-Wert zu sein, in der Sprache C++ keine Eigenschaft eines Objekts ist, sondern vielmehr eine Eigenschaft eines Ausdrucks (d. h.eine Eigenschaft seines Ergebnisses).So ist es tatsächlich in der Sprachspezifikation definiert:Für verschiedene Arten von Ausdrücken wird angegeben, wann das Ergebnis ein l-Wert und wann ein r-Wert ist.Dies bedeutet unter anderem, dass auf ein temporäres Objekt sowohl als R-Wert als auch als L-Wert zugegriffen werden kann, abhängig von der spezifischen Ausdrucksform, die für den Zugriff verwendet wird.

Zum Beispiel das Ergebnis von literal 2 + 3 Ausdruck ist offensichtlich ein R-Wert, ein temporärer Typ int.Wir können das Unäre nicht anwenden & dazu seit unary & erfordert einen L-Wert als Operanden

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

Wie wir jedoch alle wissen, kann eine konstante Referenz an ein temporäres Objekt angehängt werden, wie in

const int &ri = 2 + 3;

In diesem Fall wird die Referenz dem Provisorium beigefügt, wodurch dessen Lebensdauer verlängert wird.Sobald dies erledigt ist, haben wir natürlich Zugriff auf denselben temporären Wert als L-Wert ri, da Referenzen immer L-Werte sind.Zum Beispiel können wir das Unäre einfach und legal anwenden & auf die Referenz und erhalten Sie einen Zeiger auf das Temporäre

const int *pi = &ri;

wobei dieser Zeiger vollkommen gültig bleibt, solange das Temporäre bestehen bleibt.

Ein weiteres offensichtliches Beispiel für den L-Wert-Zugriff auf ein temporäres Objekt ist der Zugriff auf ein temporäres Objekt des Klassentyps über dessen this Zeiger.Das Ergebnis von *this ist ein L-Wert (wie es immer beim Ergebnis von unary der Fall ist). * auf einen Datenzeiger angewendet), ändert jedoch nichts an der Tatsache, dass das tatsächliche Objekt leicht ein temporäres Objekt sein kann.Für einen bestimmten Klassentyp T, Ausdruck T() ist ein R-Wert, wie im Sprachstandard ausdrücklich angegeben, jedoch das temporäre Objekt, über das zugegriffen wird *T().get_this() Ausdruck (mit der offensichtlichen Implementierung von T::get_this()) ist ein L-Wert.Im Gegensatz zum vorherigen Beispiel können Sie mit dieser Methode sofort einen nicht konstant qualifizierten L-Wert erhalten, der auf ein temporäres Objekt verweist.

Also wiederum kann dasselbe temporäre Objekt leicht als R-Wert oder als L-Wert „gesehen“ werden, je nachdem, welche Art von Ausdruck (welche Art). Zugriffspfad), mit dem Sie das Objekt „betrachten“.

Andere Tipps

Prasoon Saurav hat bereits einen sehr guten CLC ++ - Thread verknüpft. Dort erklärt James Kanze, warum die Frage keinen Sinn macht. Es läuft auf:

  • rvalue -ness ist eine (boolesche) Eigenschaft von Ausdrücken - jeder Ausdruck ist entweder ein LVALUE oder ein RValue
  • Zeiträume sind nicht Ausdrücke

Aus diesem Grund macht die Frage keinen Sinn.

Ein gutes Beispiel ist der folgende Code:

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

Der vorübergehende int mit Wert 4 ist kein Ausdruck. Der Ausdruck ri Das ist gedruckt ist nicht vorübergehend. Es ist ein Lvalue und bezieht sich auf eine vorübergehende.

Nun, dieser Array-Operator gibt eine Referenz zurück. Könnte man davon ausgehen, dass jede Funktion, die eine Referenz zurückgibt, dasselbe tut?Alle Referenzen sind konstant. Sie können zwar L-Werte sein, sie ändern jedoch das, worauf sie verweisen, nicht die Referenz selbst.Gleiches gilt für die *Operator,

*(a temp pointer) = val;

Ich schwöre, ich habe früher einen Compiler verwendet, der temporäre Werte an jede Funktion übergab, die eine Referenz benötigte.

also könntest du gehen:

int Afunc()
{
   return 5;
}

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


anotherFunc(Afunc());

Ich kann jedoch keine finden, mit der Sie das jetzt tun können. Die Referenz muss const sein, um die Übergabe von temporären Werten zu ermöglichen.

int anotherFunc(const int & b);

Wie auch immer, Referenzen können L-Werte und temporär sein. Der Trick besteht darin, dass die Referenz selbst nicht geändert wird, sondern nur das, worauf sie verweist.

wenn man das mitzählt-> Operator als Operator verwenden, können temporäre Zeiger L-Werte sein, aber es gilt die gleiche Bedingung: Es wird nicht der temporäre Zeiger geändert, sondern das Ding, auf das er zeigt.

Ein Array -Indexierungsvorgang ist sowohl ein vorübergehender als auch ein lvalue, so etwas wie ein [10] = 1 ist ein Beispiel für das, wonach Sie suchen. Der Lvalue ist ein vorübergehender, berechneter Zeiger.

Kurze Antwort:ja, aber ich werde den Standard nicht zitieren, denn um den Punkt zu beweisen, müsste jede Art von temporärem angesprochen werden, die es gibt.Per Definition hat ein temporäres eine Lebensdauer von einer Aussage, also wäre es bestenfalls ein schlechter Stil, Dinge einem zuzuweisen.

Interessante Antwort:Kopierelision kann (oft macht) ein temporäres Objekt identisch mit einem lvalue-Objekt machen.Beispielsweise,

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

oder

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

Bearbeiten: in Bezug auf die Frage, ob in diesen Fällen ein vorübergehendes Objekt vorliegt, erwähnt §12.8 / 15

der Kopiervorgang kann weggelassen werden, indem das temporäre Objekt direkt in das Ziel der ausgelassenen Kopie eingefügt wird

was darauf hindeuten würde, dass es ein temporäres Objekt gibt, das mit einem l-Wert identisch sein kann.

SharePoint Designer bietet eine Sammlung von Workflow-Aktionen, die über die Workflow Designer-Benutzeroberfläche (UI) verfügbar sind. Obwohl das Sortiment an Workflow-Aktionen, die in SharePoint Designer enthalten sind, umfangreich ist, ist es dennoch endlich. In einigen Fällen müssen Sie möglicherweise einen Geschäftsprozess modellieren, dessen Anforderungen nicht von der vorhandenen Bibliothek der Workflow-Aktionen erfüllt werden, die im SharePoint Designer verfügbar sind.

Sie können sich die folgenden Links ansehen,

Best Practices zum Erstellen von benutzerdefinierten Aktivitäten in SharePoint 2010

Nützliche SharePoint Designer Benutzerdefinierte Workflow-Aktivitäten. -> In diesem Fall können Sie den "Senden" verwenden E-Mail mit der E-Mail mit der HTTP-Dateianhangsaktivität "-> Diese Aktivität ermöglicht das Senden von E-Mails mit Anhängern, die mit einer Webanforderung abgerufen werden. Ausführen von Reporting Services-Bericht und Versenden als Anhang aus dem SPD-Workflow wäre ein solches Beispiel. Die Anforderungs-URL ist vollständig anpassbar und kann Workflow-Variablen enthalten. Sowohl HTTP- als auch HTTPS-Anforderungen werden unterstützt. .

SharePoint 2010: Erstellen Sie eine Workflow-Aktivität mit visual Studio 2010

Benutzerdefinierte SharePoint Designer-Aktivitäten für SharePoint 2010.

Wie erstellunge ich eine benutzerdefinierte Aktion? Für einen Workflow?

Wenn nein, kann mir jemand ein Beispiel geben, in dem temporäre im Code erstellte LVALUE erzeugt werden?

Der folgende Code bindet eine konstante Referenz auf ein temporäres Objekt vom Typ const float vom Compiler erstellt:

int i;
const float &cfr = i;

Das Verhalten ist "als ob":

int i;
const float __tmp_cfr = i; // introduced by the compiler
const float &cfr = __tmp_cfr;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top