/Zc:rvalueCast (Typkonvertierungsregeln erzwingen)

Wenn die /Zc:rvalueCast Option angegeben wird, identifiziert der Compiler ordnungsgemäß einen Verweistyp für rvalue als Ergebnis eines Umwandlungsvorgangs. Das Verhalten entspricht dem C++11-Standard. Wenn die Option nicht angegeben ist, entspricht das Compilerverhalten in Visual Studio 2012.

Syntax

/Zc:rvalueCast
/Zc:rvalueCast-

Hinweise

Wenn /Zc:rvalueCast angegeben, folgt der Compiler Abschnitt 5.4 des C++11-Standards und behandelt nur Umwandlungsausdrücke, die zu Nichtverweistypen und Umwandlungsausdrücken führen, die zu Rvalue-Verweisen auf Nichtfunktionstypen als Werttypen führen. Standardmäßig oder wenn /Zc:rvalueCast- angegeben, ist der Compiler nicht konform und behandelt alle Umwandlungsausdrücke, die zu rvalue-Verweisen als Werte führen. Zur Konformität und zur Beseitigung von Fehlern bei der Verwendung von Umwandlungen empfehlen wir, dass Sie verwenden /Zc:rvalueCast.

Ist standardmäßig /Zc:rvalueCast deaktiviert (/Zc:rvalueCast-). Die Option "/permissive- compiler" legt diese Option implizit fest, kann aber mithilfe von /Zc:rvalueCast-".< überschrieben werden.

Verwenden Sie diesen /Zc:rvalueCast Ausdruck, wenn Sie einen Umwandlungsausdruck als Argument an eine Funktion übergeben, die einen Wertverweistyp verwendet. Das Standardverhalten verursacht den Compilerfehler C2664 , wenn der Compiler den Typ des Umwandlungsausdrucks falsch bestimmt. Dieses Beispiel zeigt einen Compilerfehler im korrekten Code, wenn /Zc:rvalueCast er nicht angegeben ist:

// Test of /Zc:rvalueCast
// compile by using:
// cl /c /Zc:rvalueCast- make_thing.cpp
// cl /c /Zc:rvalueCast make_thing.cpp

#include <utility>

template <typename T>
struct Thing {
   // Construct a Thing by using two rvalue reference parameters
   Thing(T&& t1, T&& t2)
      : thing1(t1), thing2(t2) {}

   T& thing1;
   T& thing2;
};

// Create a Thing, using move semantics if possible
template <typename T>
Thing<T> make_thing(T&& t1, T&& t2)
{
   return (Thing<T>(std::forward<T>(t1), std::forward<T>(t2)));
}

struct Test1 {
   long a;
   long b;

   Thing<long> test() {
      // Use identity casts to create rvalues as arguments
      return make_thing(static_cast<long>(a), static_cast<long>(b));
   }
};

Das standardmäßige Compilerverhalten meldet möglicherweise keinen Fehler C2102, wenn dies angemessen ist. In diesem Beispiel meldet der Compiler keinen Fehler, wenn die Adresse eines von einer Identitäts cast erstellten Werts bei nicht angegebener Angabe übernommen /Zc:rvalueCast wird:

int main() {
   int a = 1;
   int *p = &a;   // Okay, take address of lvalue
                  // Identity cast creates rvalue from lvalue;
   p = &(int)a;   // problem: should cause C2102: '&' requires l-value
}

Weitere Informationen über Konformitätsprobleme in Visual C++ finden Sie unter Nonstandard Behavior.

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).

  2. Wählen Sie die Konfigurationseigenschaftenseite>C/C++>-Sprache aus.

  3. Legen Sie die Eigenschaft "Typkonvertierungsregeln erzwingen" auf oder /Zc:rvalueCast-" fest/Zc:rvalueCast. Wählen Sie "OK" aus, oder "Übernehmen", um Ihre Änderungen zu speichern.

Siehe auch

/Zc (Übereinstimmung)